هل هناك آلية في Antlr للسماح للقارئ بمطابقة الرمز المميز فقط خلال قواعد معينة؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

أرغب في إضافة كلمة رئيسية إلى لغتي.

يجب أن تتم مطابقة هذه الكلمة الأساسية فقط خلال قاعدة نحوية معينة للمحلل اللغوي.

نظرًا للتوافق مع الإصدارات السابقة، أود السماح بمواصلة استخدام هذه الكلمة الرئيسية كاسم متغير، أي أنه يمكن مطابقتها بقاعدة lexer التي تحدد ما إذا كان الرمز المميز مناسبًا لاسم متغير.

يطابق Lexer القاعدة الجديدة كلما تم العثور عليها في الملف.

هل الطريقة المناسبة للتغلب على هذا هي تعديل قاعدة var_declaration بحيث تتطابق إما مع IDENT أو الرموز المميزة KEYWORD الجديدة؟

protected
modified_var_declaration:
     VAR (IDENT|KEYWORD);
;

القواعد ذات الصلة هي:

IDENT   // matches variable names
options { testLiterals=true; }
    : ( '_' | 'a'..'z' | 'A'..'Z' ) ( '_' | 'a'..'z' | 'A'..'Z' | DIGIT )*
;

KEYWORD: // my new keyword
  "key"
;

قاعدة المحلل اللغوي لإنشاء متغير هي:

protected
var_declaration:
     VAR IDENT;
;
هل كانت مفيدة؟

المحلول

تحتوي العديد من اللغات على كلمات رئيسية حساسة للسياق.الخطوة الأولى للتعامل معها هي إضافة قاعدة محلل جديدة ident يمثل اسم متغير.استخدم هذه القاعدة في المحلل اللغوي الخاص بك بدلاً من IDENT.

ident
    : IDENT
    | KEYWORD
    ;

نصائح أخرى

الدفع http://www.antlr.org/wiki/display/ANTLR3/1.+Lexer والتي ينبغي أن تساعدك.سوف تحتاج إلى تعيين وإلغاء تعيين علامة عندما يتم السماح بـ "KEYWORD"، على سبيل المثال.

KEYWORD : { keywordcontext }?=> "key";

الحيلة هنا هي تبديل المكان الذي يمكنك أن تتوقع فيه كلمة رئيسية، والتي قد تكون أقل من تافهة.

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