是否可以配置ANTLR语法以使用具有相同结构的两个令牌?

van*_*lla 2 java parsing antlr antlr4

对于下面的语法,

grammar names;

fullname : TITLE? FIRST_NAME LAST_NAME;

TITLE : 'Mr.' | 'Ms.' | 'Mrs.' ;

FIRST_NAME : ('A'..'Z' | 'a'..'z')+ ;

LAST_NAME : ('A'..'Z' | 'a'..'z')+ ;

WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ -> skip ;
Run Code Online (Sandbox Code Playgroud)

在解析像"John Smith先生"这样的输入时,它会抛出异常

 mismatched input 'Smith' expecting LAST_NAME
Run Code Online (Sandbox Code Playgroud)

是否可以配置ANTLR来处理这种情况?如果不可能,可以采用哪种替代方法来处理它?

请注意,它不仅限于这种简单的情况.

Jac*_*all 5

FIRST_NAME和之间没有语法差异LAST_NAME; 你只需要分配它们.

grammar names;

fullname : TITLE? first=NAME last=NAME;

TITLE : 'Mr.' | 'Ms.' | 'Mrs.' ;

NAME : ('A'..'Z' | 'a'..'z')+ ;

WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ -> skip ;
Run Code Online (Sandbox Code Playgroud)

然后,您可以调用get("first")get("last")从匹配中提取已解析的值.