当我从Antlr 3升级到Antlr 4时,我删除了语法中的所有语法谓词。但是当我改变它时,我收到标题中提到的错误。
这是更改后的代码
NUMBER
:(
'0'..'9' ('.' '0'..'9'+)?
| '.' '0'..'9'+
)
(
E
(
M { $type = EMS; }
| X { $type = EXS; }
)
| P
(
X
| T
| C
)
{ $type = LENGTH; }
| C M { $type = LENGTH; }
| M
(
M { $type = LENGTH; }
| S { $type = TIME; }
)
| I N { $type = LENGTH; }
| D E G { $type = ANGLE; }
| R A D { $type = ANGLE; }
| S { $type = TIME; }
| K? H Z { $type = FREQ; }
| IDENT { $type = DIMENSION; }
| '%' { $type = PERCENTAGE; }
| // Just a number
)
;
这是我得到的错误。
我看到了这个问题的答案here
。但我无法理解它的含义。请给我一些指导。
编辑:
语法中出现相同的错误。
fragment INVALID :;
STRING : '\'' ( ~('\n'|'\r'|'\f'|'\'') )*
(
'\''
| { $type = INVALID; }
)
| '"' ( ~('\n'|'\r'|'\f'|'"') )*
(
'"'
| { $type = INVALID; }
)
;
我无法将其更改为ANTLR 4.此代码中的新功能是什么?请给我一个快速解决方法。
答案 0 :(得分:2)
您的NUMBER
规则已被大量手动左分解。实际上,它是单个词法分析器规则,可生成9种不同类型的令牌。由于ANTLR 3词法分析器使用递归下降解析器进行预测的方式,可能会执行左因子分解。 ANTLR 4使用基于DFA的完全不同的词法分析器算法。您看到的错误是此更改的结果 - 因为ANTLR 4词法分析器不再是递归下降解析器,它们不再能够在任意点执行操作代码。
在ANTLR 4中编写上述规则的最有效方法是使用ANTLR 3中的“低效”语法。在ANTLR 4中,它不会很慢。
EMS
: NUMBER E M
;
EXS
: NUMBER E X
;
LENGTH
: NUMBER P X
| NUMBER P T
| NUMBER P C
| NUMBER C M
| NUMBER M M
| NUMBER I N
;
TIME
: NUMBER M S
| NUMBER S
;
ANGLE
: NUMBER D E G
| NUMBER R A D
;
FREQ
: NUMBER K? H Z
;
DIMENSION
: NUMBER IDENT
;
PERCENTAGE
: NUMBER '%'
;
NUMBER
: [0-9] ('.' [0-9]+)?
| '.' [0-9]+
;