请考虑以下语法,这会给我带来意想不到的行为:
lexer grammar TLexer;
WS : [ \t]+ -> channel(HIDDEN) ;
NEWLINE : '\n' -> channel(HIDDEN) ;
ASTERISK : '*' ;
SIMPLE_IDENTIFIER : [a-zA-Z_] [a-zA-Z0-9_$]* ;
NUMBER : [0-9] [0-9_]* ;
和
parser grammar TParser;
options { tokenVocab=TLexer; }
seq_input_list :
level_input_list | edge_input_list ;
level_input_list :
( level_symbol_any )+ ;
edge_input_list :
( level_symbol_any )* edge_symbol ;
level_symbol_any :
{getCurrentToken().getText().matches("[0a]")}? ( NUMBER | SIMPLE_IDENTIFIER ) ;
edge_symbol :
SIMPLE_IDENTIFIER | ASTERISK ;
输入0 *
被解析得很好,但解析器无法识别0 f
(在输入'f'处没有可行的选择)。如果我更改seq_input_list中规则的顺序,则会识别两个输入。
我的问题是,如果这确实是一个ANTLR问题,或者我理解语义谓词的使用是错误的。我希望输入0 f
被识别为(seq_input_list (edge_input_list (level_symbol_any ( NUMBER) edge_symbol ( SIMPLE_IDENTIFIER ) ) )
。
提前谢谢!
儒略