خطأ عودي في القواعد النحوية لـ Antlr4
سؤال
أواجه مشكلة كبيرة مع antlr4 الآن.
كلما حاولت إطعام antlr بقواعد RPN هذه
grammar UPN;
//Parser
expression : plus | minus | mult | div | NUMBER;
plus : expression expression '+';
minus : expression expression '-';
mult : expression expression '*';
div : expression expression '/';
//Lexer
NUMBER : '-'? ('0'..'9')+;
سوف يرمي antlr خطأً لأن علامات الجمع والطرح والتعدد وdiv يتم تركها بشكل متكرر بشكل متبادل.
لا أعرف كيفية إصلاح ذلك.
(أعلم أن هذا يحدث لأنه مع هذا "التعبير" النحوي يمكن أن يتكرر بشكل لا نهائي، لقد واجهت هذه المشكلة من قبل مع قواعد نحوية أخرى، ولكن يمكنني إصلاح ذلك بنفسي)
الحل الوحيد هو تقييد القواعد النحوية بالطريقة التالية
grammar UPN;
//Parser
expression : plus | minus | mult | div | NUMBER;
exp2 : plus2 | minus2 | mult2 | div2 | NUMBER;
plus : exp2 exp2'+';
minus : exp2 exp2'-';
mult: exp2 exp2'*';
div: exp2 exp2'/';
plus2 : NUMBER NUMBER '+';
minus2 : NUMBER NUMBER '-';
mult2: NUMBER NUMBER '*';
div2: NUMBER NUMBER '/';
//Lexer
NUMBER : '-'? ('0'..'9')+;
لكن هذا ليس ما أريده حقًا، لأنني الآن أستطيع العمل بأقصى قدر ممكن مع تعبيرات مثل
2 3 + 5 4 - *
وستكون القواعد النحوية أكثر تعقيدًا مما يمكن أن تكون عليه في الواقع.
اتمنى منكم ياشباب المساعدة
المحلول
يدعم ANTLR4 فقط القواعد العودية اليسرى "المباشرة"، وليس "غير المباشرة"، كما هو الحال لديك.
جرب شيئًا مثل هذا:
grammar RPN;
parse : expression EOF;
expression
: expression expression '+'
| expression expression '-'
| expression expression '*'
| expression expression '/'
| NUMBER
;
NUMBER : '-'? ('0'..'9')+;
SPACES : [ \t\r\n] -> skip;
بالمناسبة، 23+54-*
ليس تعبير RPN صالحًا:يجب أن يبدأ برقمين.