[英]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
的目的是區分開始和結束,但為此存在標簽。
如果這不起作用,請發布您的完整語法; 例如,您發布的那個不包含DEGREE
的規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.