构造文法时表达式中算符优先级的问题
文法用于描述一种语言,语言中包含多个句子,句子又是由表达式组成的。多个原子表达式(不可再分的表达式,比如:a+b,c*d,-a等)和操作符或者括号一起又可以组成复合表达式(比如:a+b*c,a*(b+c)等)。在书写表达式文法时需要注意算符优先级问题,比如:四则运算中要优先计算乘除,然后才是加减,而被括号括起的表达式具有更高的优先级。解决优先级问题可以采取从优先级低的算符到优先级高的算符的顺序构造文法规则,由于括号相对于操作符具有更高的优先级,所以由括号括起的复合表达式可以作为原子表达式处理。下面拿四则运算举例说明:
compexpr : compexpr '||' andexpr | andexpr andexpr : andexpr '&&' factor | factor factor : ID '>' NUMBER | ID '<' NUMBER | ID '==' NUMBER | ID '!=' NUMBER | '(' compexpr ')'根据四则运算和比较运算的文法,我们可以总结具有优先级的表达式文法的构造原则是:
1. 从低优先级到高优先级的顺序构造规则。
2. 每个复合表达式都有一个只包含下一个优先级的表达式作为解析选项。
3. 括号具有高优先级,被括号括起的符合表达式作为原子表达式。