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



假设我有以下输入:

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          : [ tr]+ -> 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的工作方式。

在您的情况下(不仅是可选的),第一条规则将捕获YEAR_START。这意味着遵循令牌化

"Graduated in 2010" -> WORD WORD YEAR_START

唯一的匹配规则是

 years:      WORD* ( (YEAR_START '-')? YEAR_END) WORD* SEPARATOR;

但是' - '缺少。

如果您删除YEAR_STARTYEAR_END规则,则语法应起作用,并用YEAR替换所有出现。可能YEAR_STARTYEAR_END有目的是区分开始和结束,但为此目的存在标签。

如果这不起作用,请发布完整的语法;您发布的那个,例如不包含DEGREE的规则。

相关内容

  • 没有找到相关文章

最新更新