1
我試圖解析使用以下語法日期:錯誤在解析日期Antlr4
grammar Dates;
formattedDate : (DATE '/' MONTH '/' year);
year : SHORT_YEAR | FULL_YEAR;
SHORT_YEAR : DIGIT DIGIT;
FULL_YEAR : ('19' | '20' | '21') DIGIT DIGIT;
DATE : (('0'..'2')? DIGIT) | '30' | '31';
MONTH : ('0'? DIGIT) | '11' | '12';
fragment DIGIT : ('0' .. '9');
但它無法解析,我預期的那樣工作的值。例如,11/04/2017
輸入產生錯誤:
line 1:0 mismatched input '11' expecting DATE
我的第一個猜測是,有一些值(1-12)的詞法分析器不能決定,如果它是一個DATE
或MONTH
,這是造成問題。但是,當我試圖用語法規則代替他們,而不是修復它,我有同樣的問題:
formattedDate : (dateNum '/' monthNum '/' year);
year : shortYear | fullYear;
shortYear : DIGIT DIGIT;
fullYear : ('19' | '20' | '21') DIGIT DIGIT;
dateNum : (('0'..'2')? DIGIT) | '30' | '31';
monthNum : ('0'? DIGIT) | '11' | '12';
fragment DIGIT : ('0' .. '9');
而且它似乎仍然對第一值鬥爭,即使它像31
,範圍之外歧義。
我在這裏做錯了什麼?
這也許顯而易見的,爲什麼我第一次嘗試不起作用。令牌重疊,因此詞法分析器不可能是明確的。我在這裏也看到了很多關於其他問題的建議,說不要試圖在語法中加入太多的限制,而是在解析之後留下那些驗證錯誤。但是,我仍然想明白爲什麼這個特殊情況不起作用。 –