الأسبقية المشغل Antll
-
12-09-2019 - |
سؤال
كيف يتم تنفيذ أسبقية المشغل في 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;
يرجى إلقاء نظرة على مستندات للتفاصيل.
لا تنتمي إلى StackOverflow