Antlr: تحليل أرقام مكونة من رقمين عندما تكون الحرفي الرقمي الآخر ممكنا
-
23-08-2019 - |
سؤال
أنا أكتب قواعد اللغة للحصول على لغة معتدلة الحجم، وأنا أحاول تنفيذ حرفي الوقت للنموذج hh:mm:ss
.
ومع ذلك، كلما حاولت التحليل، على سبيل المثال، 12:34:56
ك timeLiteral
, ، أشعر باستثناءات رمزية غير متطابقة على الأرقام. هل أي شخص يعرف ما قد أفعله خطأ؟
فيما يلي القواعد ذات الصلة كما هو محدد حاليا:
timeLiteral
: timePair COLON timePair COLON timePair -> ^(TIMELIT timePair*)
;
timePair
: DecimalDigit DecimalDigit
;
NumericLiteral
: DecimalLiteral
;
fragment DecimalLiteral
: DecimalDigit+ ('.' DecimalDigit+)?
;
fragment DecimalDigit
: ('0'..'9')
;
المحلول
المشكلة هي أن Lexer يلتزم Decimaldigit وإعادة numericliteral.
لن يرى المحلل اللاحمانيين أبدا لأنها قاعدة شظية.
أود أن أوصي بالوقت المتحرك في Lexer (الاستفادة من اسمها). لذلك سيكون لديك شيء مثل
timeLiteral
: TimeLiteral -> ^(TIMELIT TimeLiteral*)
;
number
: DecimalLiteral
;
TimeLiteral
: DecimalDigit DecimalDigit COLON
DecimalDigit DecimalDigit COLON
DecimalDigit DecimalDigit
;
DecimalLiteral
: DecimalDigit+ ('.' DecimalDigit+)?
;
fragment DecimalDigit
: ('0'..'9')
;
ضع في اعتبارك أن Lexer و Parser مستقلة تماما. يحدد Lexer الرموز التي سيتم تمريرها إلى المحلل ومن بعد المحلل يحصل على جماعة لهم.
لا تنتمي إلى StackOverflow