parsing - ANTLR 4 中的重叠 token

标签 parsing antlr lexer antlr4

我有以下 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/

相关文章:

ruby-on-rails - 用于 Web 解析器的 Rails 还是 Node?

c# - 我可以将 ANTLR 用于未预处理的代码吗?

parsing - ANTLR : issue with greedy rule

parsing - 进一步解析特殊情况下的表达式

java - antlr 访问者返回一个空的解析树

java - 如何在 Java 中解析基本查询(类似于 Google 数据)?

c# - 我如何解析挪威货币

javascript - 在 JavaScript 中多次绑定(bind)事件监听器

debugging - ANTLRWorks 调试 - 不同颜色的含义?

python-3.x - ANTLR4 : Use getText() in label of python