parsing - 如何修复我的 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
解决方案
使注释规则至少匹配一个非空白字符,否则它可以匹配与Asterisk
规则相同的内容,如下所示:
Comment: '*' ' '* ~[\r\n]+;
推荐阅读
- apache-spark - 如何创建 Pyspark 应用程序
- python - Python:在 xml 中,如何在某些条件下删除节点
- android - 几秒钟后,如何在本机反应中从启动屏幕移动到登录屏幕?
- c++ - 为什么这个动态数组实现比 std::vector 慢
? - kubernetes - 使用节点选择器确保每个节点中的 pod 数量最少
- r - 在 R 中根据之前的特定单词和之后的 % 符号提取字符串或值
- spring - 用于更改 Hibernate 5 CriteriaQuery 的 SQL 查询
- javascript - 输出结果时获取[object Object]
- binary - 方案二进制转十进制
- javascript - Tinymce 编辑器不再在 bigcommerace 中显示