[英]Antlr grammar not matching expected lexer rule
我正在嘗試使用以下規則匹配持續時間字符串,例如for 30 minutes
或for 2 hours
:
durationPhrase: FOR_STR (MINUTE_DURATION | HOUR_DURATION);
MINUTE_DURATION: NONZERO_NUMBER MINUTE_STR;
HOUR_DURATION: NONZERO_NUMBER HOUR_STR;
MINUTE_STR: 'minute'('s')?;
HOUR_STR: 'hour'('s')?;
FOR_STR: 'for';
NONZERO_NUMBER: [0-9]+;
WS: (' '|[\n\t\r]) -> skip;
輸入以下內容:
for 30 minutes
嘗試調試/匹配durationPhrase
規則時,出現以下錯誤:
line 1:4 mismatched input '30' expecting {MINUTE_DURATION, HOUR_DURATION}
但是我似乎無法弄清楚“ 30”匹配的詞法規則是什么? 我印象中“最長的”詞法分析器規則將獲勝,這將是 MINUTE_DURATION
規則。
而是首先匹配NONZERO_NUMBER
嗎? 如果是這樣,為什么?
它與NONZERO_NUMBER
匹配,因為其他任何模式均不適用。 如果您輸入了30minutes
,則它將與MINUTE_DURATION
相匹配,但作為令牌模式, MINUTE_DURATION
將與空格字符不匹配。
您可以通過-> skip
令牌WS
來忽略空格。 只有在將WS
識別為令牌后才能發生這種情況。 即在標記化之后。 在標記化過程中,空格字符只是字符。
如果您制定MINUTE_DURATION
和HOUR_DURATION
語法規則而不是詞法規則,則它應能按預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.