java - 如何处理 ANTLR 语法规则中的歧义标记?

标签 java antlr antlr4

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

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”这样的名字时,它工作正常 但是当其中一个标题标记显示为“约翰先生史密斯先生”之类的名称时,我收到以下错误

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>)

有没有办法只根据它在规则中的位置使用 token ,如果它出现在另一个位置则忽略它?

最佳答案

只要词法分析器不会忽略它,解析器规则就应该改成

name : NAME | TITLE;

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

关于java - 如何处理 ANTLR 语法规则中的歧义标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29517206/

相关文章:

来自 ANTLR 解析树的 Python AST?

ANTLR4 使用 HIDDEN channel 会导致错误,而使用跳过不会

antlr4 - 如何使用左递归和贪婪的 '?' 运算符选择解析器规则优先级?

parsing - ANTLR 规则消耗固定数量的字符

java - 为 "Step"作用域 bean 编写 JUnit 测试 - 没有为作用域名称 "step"注册作用域(Spring Batch 3.0.10)

java - 使用 beanshell 验证文件是否存在于 jmeter 中的某个位置

java - 禁用按钮在火狐中工作正常,但在 IE 中不行

java - 设置 GUI 元素大小的正确方法是什么?

java - ANTLR - 输入错误不匹配

regex - 如何检测序列与模式的偏差?