如何使用ANTLR4中的可选部分创建词法规则

时间:2016-09-20 01:40:26

标签: grammar antlr4 lexical-analysis

我正在尝试使用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;

1 个答案:

答案 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