我正在尝试使用ANTLR4创建一个语法来定义布尔文字。它可以采用" BOOL#TRUE"或者只是" 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;
答案 0 :(得分:2)
与大多数词法扫描程序生成器一样,Antlr优先于匹配令牌的第一个规则,在最长可能令牌可以由两个或多个规则匹配的情况下。
在您的语法中,function createArtistTable(name)
{
var message = "test";
//return message and name
}
和function openArtistTable(name)
{
google.script.run
.withSuccessHandler(openSuccess)
.withFailureHandler(openFailure)
.createArtistTable(name)
}
function openSuccess(//have 2 values here -- var1, var2)
{
console.log(var1);
console.log(var2);
}
可以匹配为标识符或布尔文字。由于标识符规则在语法中较早出现,因此它将获胜,因此TRUE
将成为标识符。
所以将FALSE
规则放在显示FALSE
规则的位置 - 或者至少在Bool_literal
规则之前 - 然后它将获胜。
请参阅问题“为什么我的关键字被视为标识符?”在this Antlr4 FAQ。