Parsing 什么';这是在antlr4中处理可选令牌的最佳方法

Parsing 什么';这是在antlr4中处理可选令牌的最佳方法,parsing,lexer,antrl4,Parsing,Lexer,Antrl4,假设我有以下输入: Great University Graduated in 2010 Some University 09/2009 - 06/2011 Nice University 06/2011 我想应付多年的学习。我的语法是这样的: education: (section)* EOF ; section: (school | years)+ ; degree: WORD* DEGREE WORD* SEPARATOR; years:

假设我有以下输入:

Great University
Graduated in 2010
Some University
09/2009 - 06/2011
Nice University
06/2011
我想应付多年的学习。我的语法是这样的:

education:
    (section)*
    EOF
    ;

section:
    (school | years)+
   ;

degree:     WORD* DEGREE WORD* SEPARATOR;
years:      WORD* ( (YEAR_START '-')? YEAR_END) WORD* SEPARATOR;
WS          : [ \t\r]+ -> skip;
SEPARATOR   : (NEWLINE | COMMA);
COMMA       : ',';
NEWLINE     : '\n';
SCHOOL      : ('university' | 'University' | 'school' | 'School');
WORD        : [a-zA-Z'()]+;
YEAR_START  : YEAR;
YEAR_END    : YEAR;
YEAR        : (DIGIT DIGIT '/')? [1-2] DIGIT DIGIT DIGIT;
DIGIT       : [0-9];
我遇到以下错误:

line 1:17 mismatched input '\n' expecting '-'
line 6:17 mismatched input '\n' expecting '-'

如何通过语法处理可选的起始年?

lexer只能将一种令牌类型分配给一种模式。您希望它将年份模式分配给三种令牌类型,并在运行时决定哪一种是正确的。这不是ANTLR的工作方式

在您的情况下,所有年份(不仅仅是可选年份)都将被第一条规则捕获,即
年份\u开始
。这意味着遵循标记化

"Graduated in 2010" -> WORD WORD YEAR_START
唯一的匹配规则是

 years:      WORD* ( (YEAR_START '-')? YEAR_END) WORD* SEPARATOR;
但是缺少了“-”

如果删除
YEAR\u START
YEAR\u END
规则并用
YEAR
替换所有出现的规则,则语法应该有效。可能
YEAR\u START
YEAR\u END
具有区分开始和结束的目的,但为此目的存在标签

如果这不起作用,请张贴完整的语法;例如,您发布的内容不包含
学位的规则