在 antlr4 中处理可选令牌的最佳方法是什么
What's the best way to handle optional tokens in 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 : [ \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 '-'
如何通过语法处理可选的开始年份?
词法分析器只能将一种标记类型分配给一种模式。您希望它将年份模式分配给三种令牌类型,并在运行时决定哪一种是正确的。这不是 ANTLR 的工作方式。
在您的情况下,所有年份(不仅是可选年份)都将被第一条规则捕获,即 YEAR_START
。这意味着遵循标记化
"Graduated in 2010" -> WORD WORD YEAR_START
唯一的匹配规则是
years: WORD* ( (YEAR_START '-')? YEAR_END) WORD* SEPARATOR;
但是缺少“-”。
如果删除 YEAR_START
和 YEAR_END
规则并将所有出现的地方替换为 YEAR
,语法应该可以正常工作。可能 YEAR_START
和 YEAR_END
的目的是区分开始和结束,但为此目的存在标签。
如果这不起作用,请post你的完整语法;你 posted 做的那个,例如不包含 DEGREE
.
的规则
假设我有以下输入:
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 '-'
如何通过语法处理可选的开始年份?
词法分析器只能将一种标记类型分配给一种模式。您希望它将年份模式分配给三种令牌类型,并在运行时决定哪一种是正确的。这不是 ANTLR 的工作方式。
在您的情况下,所有年份(不仅是可选年份)都将被第一条规则捕获,即 YEAR_START
。这意味着遵循标记化
"Graduated in 2010" -> WORD WORD YEAR_START
唯一的匹配规则是
years: WORD* ( (YEAR_START '-')? YEAR_END) WORD* SEPARATOR;
但是缺少“-”。
如果删除 YEAR_START
和 YEAR_END
规则并将所有出现的地方替换为 YEAR
,语法应该可以正常工作。可能 YEAR_START
和 YEAR_END
的目的是区分开始和结束,但为此目的存在标签。
如果这不起作用,请post你的完整语法;你 posted 做的那个,例如不包含 DEGREE
.