簡體   English   中英

在 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_STARTYEAR_END規則並用YEAR替換所有出現的內容,則語法應該有效。 可能YEAR_STARTYEAR_END的目的是區分開始和結束,但為此存在標簽。

如果這不起作用,請發布您的完整語法; 例如,您發布的那個不包含DEGREE的規則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM