Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to tell the precedence of operators in a context free grammar

How can we know which of the following logical operations ( or, and, not ) in the bellow context free grammar have higher precedence? Is there a general approach to this kind of problems?

X → X or Y | Y

Y → Y and Z | Z

Z → not Z | (X) | true | false

like image 753
Ashkan Kazemi Avatar asked Dec 15 '22 19:12

Ashkan Kazemi


1 Answers

Here's an example approach:

expr -> addExpr;
addExpr -> multExpr (('+'|'-') multExpr)*;
multExpr -> terminalExpr (('*'|'/') terminalExpr)*;
terminalExpr -> integer | variable | '(' expr ')';

But the associativity is ambiguous. Here's a more explicit way in BNF:

expr -> addExpr;
addExpr -> addExpr '+' multExpr | addExpr '-' multExpr | multExpr;
multExpr -> multExpr '*' terminalExpr | multExpr '/' terminalExpr | terminalExpr;
terminalExpr -> integer | variable | '(' expr ')';

These grammars define the operators * and / as having more precedence as + and -. You declare the operation with higher precedence deeper in the parse tree, so they will be tried first by the parser.

like image 60
Lucas Trzesniewski Avatar answered Dec 28 '22 09:12

Lucas Trzesniewski