首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ANTLR4中创建具有可选部分的词法规则

如何在ANTLR4中创建具有可选部分的词法规则
EN

Stack Overflow用户
提问于 2016-09-20 01:40:26
回答 1查看 510关注 0票数 1

我正在尝试创建一个语法来使用ANTLR4来定义布尔文字。它的形式可以是"BOOL#TRUE",也可以是“真”。

如果我将它定义为如下的词法规则:

代码语言:javascript
复制
Bool_Literal    : ( 'BOOL' '#' )? ( 'FALSE' | 'TRUE' );    

Antlr无法匹配输入:

代码语言:javascript
复制
isHigh := FALSE;   

错误是“不匹配的输入'FALSE‘期望Bool_Literal”。

但如果我把它改为语法规则:

代码语言:javascript
复制
bool_literal    : ( 'BOOL' '#' )? ( 'FALSE' | 'TRUE' );  

它可以正确地识别"BOOL#FALSE“或"FALSE”。

似乎词汇规则无法检测以可选部分开头的标记,有人知道为什么吗?

谢谢!

韦恩

这是我的语法:

代码语言:javascript
复制
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';  

我的测试输入:

代码语言:javascript
复制
isLow := BOOL#TRUE;  
isLow2 := BOOL#FALSE;  
isHigh := FALSE;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-20 02:59:29

与大多数词法扫描器生成器一样,Antlr优先考虑与令牌匹配的第一个规则,如果最长的可能标记可以由两个或多个规则匹配。

在语法中,TRUEFALSE可以作为标识符匹配,也可以作为布尔文本匹配。由于标识符规则在语法中较早出现,因此它将获胜,因此FALSE将成为标识符。

所以把Bool_literal规则放在bool_literal规则出现的地方--或者至少在identifier规则之前--然后它就会赢。

参见“为什么将我的关键字作为标识符处理?”在这个Antlr4常见问题中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39584461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档