【问题标题】:How to handle ambiguous token in grammar rule in ANTLR?如何处理ANTLR语法规则中的歧义标记?
【发布时间】:2015-04-11 04:37:04
【问题描述】:

我有以下语法用于规范化后解析人名。

exp : fullName EOF;
fullName : title? f=name m=name? l=name;

title: TITLE;
name : NAME;

TITLE : 'mr'| 'mrs' | 'ms';
NAME : ('a'..'z')+;

WHITESPACE : ('\t' | ' ' | '\r' | '\n'| '\u0020' | '\u000C' )+ -> skip ;

当我解析像“mr john me smith”这样的名字时,它可以正常工作 但是当其中一个标题标记显示为“mr john mr smith”之类的名称时,我收到以下错误

line 1:8 extraneous input 'mr' expecting NAME
line 1:16 missing NAME at '<EOF>'
(exp (fullName (title mr) (name john) (name mr smith) (name <missing NAME>)) <EOF>)

有没有办法只根据它在规则中的位置使用令牌,如果它出现在其他位置则忽略它?

【问题讨论】:

  • 词法分析器独立于解析器运行,因此mr 将始终被解析为TITLE。查看@SaraVF 的解决方案

标签: java antlr antlr4


【解决方案1】:

只要词法分析器不能忽视它,解析器规则就应该改为

name : NAME | TITLE;

修改词法分析器规则不会解决问题,并且会产生另一个错误。

【讨论】:

    【解决方案2】:

    好久没用antlr了,试试用吧

    NAME : TITLE | ('a'..'z')+;
    

    我认为你不能忽视它。antlr 看到令牌是一个 TITLE,因此它停止查找。说标题也是 NAMES,你有一个解决这种情况的方法。

    【讨论】:

    • 感谢您的反馈,它并不完全有效,但它启发了我解决它,我将为工作规则编写更新并将其标记为已解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多