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

规范人名后,我有以下语法来解析人名.

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

有没有一种方法可以仅根据规则中的令牌位置使用令牌,而如果令牌出现在其他位置,则可以忽略它呢?

解决方法:

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

name : NAME | TITLE;

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

上一篇:小白必看的mysql~day five


下一篇:查看与修改链接学习笔记