有没有办法解析以特定字符开头的单词?
我一直在尝试以下但是我无法获得任何有希望的结果:
//This one is working it accepts AD CD and such
example1
:
.'D'
;
//This one is not, it expects character D, then any ws character then any character
example2
:
'D'.
;
//These two are not working either
example3
:
'D'.*
;
//Doesn't accept input due to error: "line 1:3 missing 'D' at '<EOF>'"
example4
:
.*'D'
;
//just in case my WS rule:
/** WhiteSpace Characters (HIDDEN)*/
WS : ( ' '
| '\t'
)+ {$channel=HIDDEN;}
;
我正在使用ANTLR 3.4
提前致谢
答案 0 :(得分:1)
//This one is not, it expects character D, then any ws character then any character example2 : 'D'. ;
不,它不接受令牌(不是字符!)'D'
后跟一个空格,然后是任何字符。由于example2
是一个解析器规则,它不匹配字符,但匹配令牌(这有很大的不同!)。由于您将空格放在单独的通道上,因此空间也不符合此规则。最后,.
(DOT)匹配任何令牌(再次:不是任何角色!)。
有关元字符(如.
(DOT))的更多信息,其含义在词法分析器和解析器规则中有所不同:Negating inside lexer- and parser rules
//These two are not working either example3 : 'D'.* ; //Doesn't accept input due to error: "line 1:3 missing 'D' at '<EOF>'" example4 : .*'D' ;
除非你确切知道自己在做什么,否则不要使用.*
:在你的情况下,它们会过多地吞噬(特别是当放在规则的开头或结尾时)。
看起来你正在尝试对解析器中的内容进行标记(所有example
规则都是解析器规则)。据我所知,这些应该是词法规则。有关解析器规则和词法分析器规则之间差异的更多信息,请参阅:Practical difference between parser rules and lexer rules in ANTLR?