سؤال

أواجه مشكلة كبيرة مع 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 صالحًا:يجب أن يبدأ برقمين.

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