是否可以将 ANTLR 语法配置为使用具有相同结构的两个标记?

Is it possible to configure ANTLR grammar to use two token having the same structure?

对于下面的语法,

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 ;

当像"Mr. John Smith"这样解析输入时,抛出异常

 mismatched input 'Smith' expecting LAST_NAME

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

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

FIRST_NAMELAST_NAME在句法上没有区别;你只需要分配它们。

grammar names;

fullname : TITLE? first=NAME last=NAME;

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

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

WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ -> skip ;

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