如何在ANTLR中处理语法规则中的模糊标记?

时间:2015-04-08 14:14:28

标签: 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 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>)

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

2 个答案:

答案 0 :(得分:2)

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

name : NAME | TITLE;

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

答案 1 :(得分:1)

我使用antlr已经有一段时间了,但尝试使用

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

我不认为你可以忽略它.. antlr看到令牌是一个标题,因此它停止寻找。说这些标题也是NAMES,你就可以解决这个问题。