如何处理 ANTLR 语法规则中的歧义标记?
How to handle ambiguous token in grammar rule in 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 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>)
有没有办法只根据它在规则中的位置使用令牌,如果它出现在另一个位置则忽略它?
好久没用antlr了,试试
NAME : TITLE | ('a'..'z')+;
我不认为你可以忽略它.. antlr 看到令牌是一个 TITLE,因此它停止寻找。说标题也是 NAMES,您有针对这种情况的解决方法。
只要词法分析器不会忽略它,解析器规则应该改为
name : NAME | TITLE;
修改词法分析器规则不会解决问题,还会产生另一个错误。
规范化后,我有以下语法来解析人名。
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>)
有没有办法只根据它在规则中的位置使用令牌,如果它出现在另一个位置则忽略它?
好久没用antlr了,试试
NAME : TITLE | ('a'..'z')+;
我不认为你可以忽略它.. antlr 看到令牌是一个 TITLE,因此它停止寻找。说标题也是 NAMES,您有针对这种情况的解决方法。
只要词法分析器不会忽略它,解析器规则应该改为
name : NAME | TITLE;
修改词法分析器规则不会解决问题,还会产生另一个错误。