首页 > 解决方案 > 如何修复我的 ANTLR 解析器以将注释与乘法分开?

问题描述

我正在使用 ANTLR4 尝试解析具有星号前导注释的代码,例如:

* This is a comment

我最初遇到乘法表达式被误认为这些注释的问题,因此决定制定我的词法分析器规则:

LINE_COMMENT : '\r\n' '*' ~[\r\n]* ;

这迫使有一个换行符,所以它看不到 2 * 3,而 '* 3' 是注释。这工作得很好,直到我的代码以第一行的注释开头,第一行没有换行符。例如:

* This is the first line of the code's file\r\n
* This is the second line of the codes's file\r\n

我也试过 {getCharPositionInLine==x}?确保它仅在当前行中有星号或空格/制表符时才识别注释。这在使用时有效

antlr4 *.g4

,但不适用于我使用生成的 JavaScript 解析器

antlr4 -Dlanguage=JavaScript *.g4

有没有办法获得与 {getCharPositionInLine==x} 相同的结果?使用我的 JavaScript 解析器或某种方式来防止乘法被识别为注释?我还应该提到,这种编码语言在行尾不使用分号。

我试过玩这个简单的语法,但我没有运气。

grammar wow;

program : expression | Comment ;
expression : expression '*' expression
           | NUMBER ;

Comment : '*' ~[\r\n]*;
NUMBER : [0-9]+ ;
Asterisk : '*' ;
Space : ' ' -> skip;

并使用测试文件:test.txt

5 * 5

标签: parsingcommentsantlr4grammarlexer

解决方案


使注释规则至少匹配一个非空白字符,否则它可以匹配与Asterisk规则相同的内容,如下所示:

Comment: '*' ' '* ~[\r\n]+;

推荐阅读