Skip to content

Latest commit

 

History

History
40 lines (28 loc) · 802 Bytes

operator_precedence.md

File metadata and controls

40 lines (28 loc) · 802 Bytes

Operator Precedence

Sometimes, our grammar may contain a few operators such as Plus and Multiply in the example below:

S: S Plus S {left}
  | S Multiply S {left}
  | A
  ;

terminals

Plus: /\+/;
Multiply: /\*/;
A: /a/;

This grammar will parse string a + a * a as (a + a) * a, which is not what we expected.

To solve this problem, we can use production priority, which is able to to specify operator precedence. We can make production S Multiply S to have higher priority, say 11.

S: S Plus S {left}
  | S Multiply S {left, 11}
  | A
  ;

terminals

Plus: /\+/;
Multiply: /\*/;
A: /a/;

Now string a + a * a is parsed as a + (a * a).

➡️ Next: Terminal Priority

📘 Back: Table of contents