当我从 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。此代码中有哪些新内容?请给我一个快速解决方案。
最佳答案
您的 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]+
;
关于c# - 错误 - 词法分析器规则 'xxxx' 中的操作必须是单个最外层 alt 的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18456455/