Member 12703506 Ответов: 0

Приоритет операций калькулятора ANTLR


Здравствуйте, я бы сделал простой пример калькулятора с помощью ANTLR, но есть проблема в приоритете операций (/,*,-,+) мой код дает им тот же приоритет ,мне нужно сделать высший приоритет для умножения и деления

это грамматика:

grammar Calc;       

start : expr EOF;

expr:   expr op expr   # binaryOp
|   Num                # num
;

op : '+'
| '-'
| '/'
| '*'
;

Num : [0-9]+;


а это и есть java код:

import org.antlr.v4.runtime.*;

import org.antlr.v4.runtime.tree.*;


public class Calc{
   public static void main(String args[])throws Exception{

    ANTLRFileStream str = new ANTLRFileStream(args[0]);

    CalcLexer lex = new CalcLexer(str);

    CommonTokenStream tok = new CommonTokenStream(lex);

    CalcParser parser = new CalcParser(tok);

    ParseTree tree = parser.start();

    System.out.println(new MyVisitor().visit(tree)); 
  }
}

class MyVisitor extends CalcBaseVisitor<Integer>{

@Override 
  public Integer visitStart(CalcParser.StartContext ctx) { 
   return visit(ctx.expr()); 
   }

@Override
 public Integer visitBinaryOp(CalcParser.BinaryOpContext ctx) {
    int lhs = visit(ctx.expr(0));
    int rhs = visit(ctx.expr(1));

    String op = ctx.op().getText();
    int res = 0;   

    if (op.equals("+")){
        res = lhs + rhs;
    }else if (op.equals("-")){
        res = lhs - rhs;
    }else if (op.equals("/")){
        res = lhs / rhs;
    }else if (op.equals("*")){
        res = lhs * rhs;
    }

 return res; 
 }

@Override
 public Integer visitNum(CalcParser.NumContext ctx) { 
 return  Integer.parseInt(ctx.Num().getText());

  }


}


Что я уже пробовал:

я попытался изменить код, потому что мне нужна та же грамматика

0 Ответов