是否可以将 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_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 ;
然后您可以调用 get("first")
和 get("last")
从匹配项中提取已解析的值。
对于下面的语法,
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_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 ;
然后您可以调用 get("first")
和 get("last")
从匹配项中提取已解析的值。