我有以下 ANTLR 4 组合语法:
grammar Example;
fieldList: field* ;
field: 'field' identifier '{' note '}' ;
note: NOTE ;
identifier: IDENTIFIER ;
NOTE: [A-Ga-g] ;
IDENTIFIER: [A-Za-z0-9]+ ;
WS: [ \t\r\n]+ -> skip ;
这解析:
field x { A }
field x { B }
这不会:
field a { A }
field b { B }
在解析失败的情况下,我认为词法分析器会感到困惑并在我希望它发出 IDENTIFIER token 的地方发出一个 NOTE token 。
编辑:
在词法分析器输出的标记中,“NOTE”标记出现在解析器期望“IDENTIFIER”的位置。 'NOTE' 具有更高的优先级,因为它首先出现在语法中。所以,我可以想到两种方法来解决这个问题……首先,我可以改变语法来消除“NOTE”和“IDENTIFIER”的歧义(比如在“NOTE”前面添加一个“$”)。或者,我可以只使用“IDENTIFIER”,在那里我会使用 note,然后在我走解析树时处理检测问题。两者都感觉不理想。当然必须有办法解决这个问题吗?
最佳答案
我实际上最终是这样解决的:
grammar Example;
fieldList: field* ;
field: 'field' identifier '{' note '}' ;
note: NOTE ;
identifier: IDENTIFIER | NOTE ;
NOTE: [A-Ga-g] ;
IDENTIFIER: [A-Za-z0-9]+ ;
WS: [ \t\r\n]+ -> skip ;
我的解析树最终仍然看起来像我想要的。
我正在开发的实际语法更复杂,基于这种方法的解决方法也是如此。但总的来说,这种方法似乎效果很好。
关于parsing - ANTLR 4 中的重叠 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19962595/