Antlr Eclipse IDE White Space 未被跳过
Antlr Eclipse IDE White Space not being skipped
如果这个问题已经被问过,我很抱歉找不到它。
我刚刚开始使用 Antlr,使用 Eclipse 的 antlr4IDE 为 Java 的一小部分创建解析器。出于某种原因,除非我在我的正则表达式中明确声明白色 space 的存在,否则解析器将抛出错误。
我的语法:
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 的新手,所以我可能犯了一个愚蠢的错误。提前致谢。
编辑:这是我的解析树和错误日志:
错误日志:
在查看 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。
像这样更改语法。
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]+ ;
如果这个问题已经被问过,我很抱歉找不到它。
我刚刚开始使用 Antlr,使用 Eclipse 的 antlr4IDE 为 Java 的一小部分创建解析器。出于某种原因,除非我在我的正则表达式中明确声明白色 space 的存在,否则解析器将抛出错误。
我的语法:
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 的新手,所以我可能犯了一个愚蠢的错误。提前致谢。
编辑:这是我的解析树和错误日志:
错误日志:
在查看 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。
像这样更改语法。
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]+ ;