我正在尝试创建一个语法来使用ANTLR4来定义布尔文字。它的形式可以是"BOOL#TRUE",也可以是“真”。
如果我将它定义为如下的词法规则:
Bool_Literal : ( 'BOOL' '#' )? ( 'FALSE' | 'TRUE' ); Antlr无法匹配输入:
isHigh := FALSE; 错误是“不匹配的输入'FALSE‘期望Bool_Literal”。
但如果我把它改为语法规则:
bool_literal : ( 'BOOL' '#' )? ( 'FALSE' | 'TRUE' ); 它可以正确地识别"BOOL#FALSE“或"FALSE”。
似乎词汇规则无法检测以可选部分开头的标记,有人知道为什么吗?
谢谢!
韦恩
这是我的语法:
grammar TT;
pou
: assignment +
;
assignment : Identifier ':=' expression ';' ;
expression : primary_expr ;
primary_expr : Bool_Literal;
//bool_literal : ( 'BOOL' '#' )? ( 'FALSE' | 'TRUE' );
// lexical
fragment Letter : [a-zA-Z]|'_' ;
fragment Digit : [0-9];
fragment Bit : [0-1];
fragment Octal_Digit : [0-7];
fragment Hex_Digit : [0-9a-fA-F];
Identifier : Letter (Letter|Digit)*;
Bool_Literal : ( 'BOOL' '#' )? ( 'FALSE' | 'TRUE' );
WS : [ \n\r\t]+ -> channel(HIDDEN) ;
Comment : '//' .*? '\n' -> channel(HIDDEN); // channel COMMENTS) //
EOL : '\n'; 我的测试输入:
isLow := BOOL#TRUE;
isLow2 := BOOL#FALSE;
isHigh := FALSE;发布于 2016-09-20 02:59:29
与大多数词法扫描器生成器一样,Antlr优先考虑与令牌匹配的第一个规则,如果最长的可能标记可以由两个或多个规则匹配。
在语法中,TRUE和FALSE可以作为标识符匹配,也可以作为布尔文本匹配。由于标识符规则在语法中较早出现,因此它将获胜,因此FALSE将成为标识符。
所以把Bool_literal规则放在bool_literal规则出现的地方--或者至少在identifier规则之前--然后它就会赢。
参见“为什么将我的关键字作为标识符处理?”在这个Antlr4常见问题中。
https://stackoverflow.com/questions/39584461
复制相似问题