Antlr: تحليل أرقام مكونة من رقمين عندما تكون الحرفي الرقمي الآخر ممكنا

StackOverflow https://stackoverflow.com/questions/886511

  •  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 الرموز التي سيتم تمريرها إلى المحلل ومن بعد المحلل يحصل على جماعة لهم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top