سؤال

كيف يتم تنفيذ أسبقية المشغل في Antlr؟

أنا أستخدم حزمة XTEXT / Antlr في الوقت الحالي.

يحرر:

فعلت ما اقترحه SEPP2K، وأعداد الأسبقية المشغل الآن، ولكن الأشياء مثل 3 + * تعمل أيضا الآن. المشغلون هم أساسا "يسقطون" الشجرة.

أيضا، لقد جربت Grammar C على موقع Antlr ونفس الشيء الذي حدث في AntlrWorks.

أي شخص يعرف ما هي المشكلة؟

BinaryExpression:
  'or'? AndOp; //or op

AndOp:
  'and'? ComparisonOp;

ComparisonOp:
  ('>'|'<'|'>='|'<='|'=='|'~=')? ConcatOp;

ConcatOp:
  '..'? AddSubOp;

AddSubOp:
  ('+' | '-')? MultDivOp;

MultDivOp:
  ('*' | '/')? ExpOp;

ExpOp:
  '^'? expr=Expression;
هل كانت مفيدة؟

المحلول

مع Antlr، يمكنك ترميز الأسبقية في قواعد القواعد. يحب:

expr:  mult ('+' mult)* ;
mult:  atom ('*' atom)* ;
atom:  INT | '(' expr ')' ;

هذا سوف تحليل "1 + 2 * 3 + (4 * 5 + 6)" باسم "(1 + (2 * 3)) + ((4 * 5) + 6)"

نصائح أخرى

نظرا لأنك تستخدم XTEXT، فسوف أوصي باستخدام مفهوم الإجراء الخاص بالكتاب. وهذا هو، فإن القواعد التعبير البسيطة سوف تبدو تشبه هذا واحد:

Sum: Product ({Sum.left=current} operator=('+'|'-') right=Product)*;
Product: Atom ({Product.left=current} operator=('+'|'-') right=Atom)*;
Atom: Number | Paren;
Paren: '(' Sum ')';
Number: value=INT;

يرجى إلقاء نظرة على مستندات للتفاصيل.

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