كيفية التحقق إذا كانت بطاقة الهوية سارية المفعول خلال تحليل - ParseTreeListener أدخل الحدث لا يسمى

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

  •  02-01-2020
  •  | 
  •  

سؤال

بلدي النحوي يحتوي على ما يلي:

assignment
: ID ASSIGN expr
;

expr
 : MINUS expr                 #unaryMinusExpr
 | NOT expr                   #notExpr
 | expr MULT expr             #multExpr
 | expr DIV expr              #divExpr
 | expr PLUS expr             #plusExpr
 | expr MINUS expr            #minusExpr
 | expr LTEQ expr             #lteqExpr
 | expr GTEQ expr             #gteqExpr
 | expr LT expr               #ltExpr
 | expr GT expr               #gtExpr
 | expr NEQ expr              #neqExpr
 | expr EQ expr               #eqExpr
 | expr AND expr              #andExpr
 | expr OR expr               #orExpr
 | atom                       #atomExpr
 ;

atom
 : OPAR expr CPAR #parExpr
 | (INT | FLOAT)  #numberAtom
 | (TRUE | FALSE) #booleanAtom
 | STRING         #stringAtom
 | ID             #idAtom
 ;

ID
 : [a-zA-Z_] [a-zA-Z_0-9]*
 ;

الهوية هنا يمثل دخول (الصف) في قاعدة بيانات المستخدم يشير إلى قبل, حسنا :), ID.لذا عند تحليل الصيغة ، أود أن تحقق أنها دخلت بطاقة هوية سارية المفعول.

من ما أستطيع أن أقول, طريقة للذهاب إلى ParseTreeListener أن يتجاوز EnterIdAtom حتى أستطيع رمي RecognitionException.لذلك أنا مدمن مخدرات ذلك ، ولكن أدخل الحدث يسمى أبدا.

class MyListener : BaseListener
{
     public override EnterIdAtom(IdAtomContext context)
     {
          if (!CheckForValidId(context.ID().GetText())
          {
               throw new RecognitionException(...)
          }
     }
}

غير متأكد لماذا ؟

هل هناك طريقة أفضل للقيام بذلك ؟

شكرا

هل كانت مفيدة؟

المحلول

يبدو أنك تستخدم Parser.addParseListener (الخط الغامق وأضاف لي):

يسجل المستمع أن تلقي الأحداث خلال عملية تحليل.

لدعم الانتاج والحفاظ على قواعد اللغة التحولات (بما في ذلك ولكن لا تقتصر على اليسار العودية إزالة الآلي اليسار العوملة ، ورمز الأمثل الجيل) ، ويدعو إلى المستمع الطرق خلال تحليل قد تختلف إلى حد كبير من المكالمات التي تتم من قبل ParseTreeWalker.DEFAULT تستخدم بعد تحليل كامل.ولا سيما القاعدة الدخول والخروج الأحداث قد تحدث في ترتيب مختلف خلال تحليل من بعد محلل. وبالإضافة إلى ذلك ، ويدعو إلى بعض حكم دخول الأساليب قد تكون محذوفة.

مع الاستثناءات المحددة التالية ، ويدعو إلى المستمع الأحداث القطعية, أيمطابقة المدخلات المكالمات إلى المستمع الأساليب سوف تكون هي نفسها.

  • تعديلات على قواعد اللغة المستخدمة لتوليد التعليمات البرمجية قد تغيير سلوك المستمع المكالمات.
  • تعديلات على خيارات سطر الأوامر التي تم تمريرها إلى ANTLR 4 عند إنشاء محلل قد تغيير سلوك المستمع المكالمات.
  • تغيير نسخة من ANTLR أداة تستخدم لتوليد محلل قد تغيير سلوك المستمع المكالمات.

إذا كانت هذه هي الحالة ، يجب أن يكون باستخدام ParseTreeWalker السير على شجرة بعد تحليل كاملة ، بدلا من محاولة خلط العمليتين معا.

نصائح أخرى

هل قمت بتعيين نقطة توقف في:

giveacodicetagpre.

أو

giveacodicetagpre.

يجب أن يمنحك هذا فكرة إذا تم استدعاء القاعدة.

حاول خلاف ذلك:

giveacodicetagpre.

سيولد سياقا جديدا "حقيقيا"، والذي يمكنك زيارةه:

giveacodicetagpre.

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