Antlr Eclipse IDE White Space 未被跳过
Posted
技术标签:
【中文标题】Antlr Eclipse IDE White Space 未被跳过【英文标题】:Antlr Eclipse IDE White Space not being skipped 【发布时间】:2017-08-11 05:38:43 【问题描述】:如果这个问题已经被问过,但似乎找不到,我提前道歉。
我刚刚开始使用 Antlr,使用 antlr4IDE for Eclipse 为一小部分 Java 子集创建解析器。出于某种原因,除非我在正则表达式中明确声明存在空格,否则解析器将抛出错误。
我的语法:
grammar Hello;
r :
(Statement ';')+
;
Statement:
DECL | INIT
;
DECL:
'int' ID
;
INIT:
DECL '=' NUMEXPR
;
NUMEXPR :
Number OP Number | Number
;
OP :
'+'
| '-'
| '/'
| '*'
;
WS :
[ \t\r\n\u000C]+ -> skip
;
Number:
[0-9]+
;
ID :
[a-zA-Z]+
;
尝试解析时
int hello = 76;
我收到错误:
Hello::r:1:0: mismatched input 'int' expecting Statement
Hello::r:1:10: token recognition error at: '='
但是,当我手动将令牌 WS 添加到规则中时,我没有收到任何错误。
任何想法我哪里出错了?我是 Antlr 的新手,所以我可能犯了一个愚蠢的错误。提前致谢。
编辑:这是我的解析树和错误日志:
错误日志:
【问题讨论】:
【参考方案1】:像这样更改语法。
grammar Hello;
r : (statement ';')+ ;
statement : decl | init ;
decl : 'int' ID ;
init : decl '=' numexpr ;
numexpr : Number op Number | Number ;
op : '+' | '-' | '/' | '*' ;
WS : [ \t\r\n\u000C]+ -> skip ;
Number : [0-9]+ ;
ID : [a-zA-Z]+ ;
【讨论】:
我仍然有同样的错误,即使在完全复制了你写的内容之后。我在原始帖子中发布了解析树 没关系,它成功了,谢谢!后续问题:你知道为什么大写符号会有所不同吗? 见Grammar Lexicon。令牌名称总是以大写字母开头。解析器规则名称始终以小写字母开头。【参考方案2】:查看the documentation on antlr4 后,您似乎必须为您希望在文件中看到的所有字符组合制定规范,从头到尾 - 而不仅仅是您想要处理的那些。
在这方面,您必须明确说明空格,例如:
WS : [ \t\r\n]+ -> skip;
这就是skip 命令存在的原因:
A 'skip' command tells the lexer to get another token and throw out the current text.
但请注意,有时这会引起一些麻烦,例如this post。
【讨论】:
OP 已经发布了他的语法,他正在跳过空格。以上是关于Antlr Eclipse IDE White Space 未被跳过的主要内容,如果未能解决你的问题,请参考以下文章
ANTLR4入门:图示说明eclipse Antlr4IDE插件的安装及语法测试过程
ANTLR4入门:使用mave ANTLR4插件(antlr4-maven-plugin)执行语法解析生成器
ANTLR4入门:使用mave ANTLR4插件(antlr4-maven-plugin)执行语法解析生成器