Home > Enterprise >  Need help in forming a correct grammar for arithmetic expressions
Need help in forming a correct grammar for arithmetic expressions

Time:05-30

I am trying to do an old archived java course for which there is no forum help. I have been stuck on one problem for a couple of days, would really appreciate any sort of help. I am supposed to make an abstract Syntax Tree using a parser. The parser reads from a Expression Grammar file, and then I have to make an Abstract tree using recursive call. The expression grammar that I have written is

    @skip whitespace{
    root ::= expr;
    expr ::=  (product | sum) ((add| multi)* (product | sum)*)*   ;
    sum ::= primitive ( add  primitive)*  ;
    product ::=  primitive (multi primitive)*;
    primitive ::= variable | number | '(' sum ')' | '(' product ')' ;
    
}

    whitespace ::= [ \t\r\n];
    number ::= [0-9] ('.'[0-9] )*;
    variable ::= [a-zA-Z] ;
    add ::= ' ';
    multi ::= '*';

with this grammar the tree I am generating is for the input 1 2 3*4 5 6*7 8 (3*2*1) is attached below

enter image description here

you can see that its picking the product when its in brackets but I dont seem to get how to write the grammar such that 3*4 and 6*7 are captured as a product too and in Sums the number that comes before a multiplication sign is not included in the previous sum node

CodePudding user response:

You could get rid of expr here, but it's maybe more scalable like this. In any case, it's really much simpler than you think:

root ::= expr;
expr ::= sum;
sum ::= product ( add product )* ;
product ::= primitive ( multi primitive )* ;
primitive ::= variable | number | '(' expr ')' ;

That should be intuitive (if you hone your intuitions :-) A sum is the sum of several products; a product cannot be the product of a sum. It can be the product of parenthesised sums, but a parenthesised sum is not a sum; it's a primitive, grammatically speaking.

  • Related