什么是编译器设计中的运算符优先解析算法?

Grammar 的任何字符串都可以使用堆栈实现来解析,就像在 shift Reduce 解析中一样。但是在运算符优先级解析中,移位和减少是基于堆栈顶部的符号与要解析的输入字符串的当前输入符号之间的优先级关系来完成的。

运算符优先级解析算法如下 -

输入- 来自某些运算符优先语法的优先关系和来自该语法的终端输入字符串。

输出- 没有输出,但它可以在我们解析时构造一个骨架解析树,一个非终端标记所有内部节点,并且未显示单个产品的使用。或者,可以将移位减少步骤的序列视为输出。

方法- 让输入字符串为 a 1 a 2 … … 。a n .$最初,堆栈包含 $。

  • 永远重复

  • 如果只有 $在堆栈上并且只有 $在输入中,则接受并中断其他

  • 开始

  • 让 a 成为堆栈中最顶层的终端符号,让 b 成为当前输入符号。

  • 如果一个 <. b 或 a =。b 然后将 b 移入堆栈 /*Shift*/

  • 否则如果一个 . >b 然后 /* 减少 */

  • 重复弹出堆栈

  • 直到栈顶终端与 < 相关。到最近弹出的终端。

  • 否则调用纠错程序结束。

Example1 - 构建语法的优先关系表。

E → E + E|E − E|E ∗ E|E⁄E|E ↑ E|(E)| - E|id

使用假设

运营商优先级协会
最高Right Associative
* 和 /次高Left Associative
+ 和 -最低Left Associative

解决方案

运算符优先关系


+*/id()$
+.>.><。<.<。<.<。.>.>
.>.><。<.<。<.<。.>.>
*.>.>.>.><。<.<。.>.>
/.>.>.>.><。<.<。.>.>
.>.>.>.><。<.<。.>.>
id.>.>.>.>.>

.>.>
(<。<.<。<.<。<.<。=
).>.>.>.>.>

.>.>
$<。<.<。<.<。<.<。

Example2 - 在以下语法中找出各种运算符和符号之间的所有优先级关系,并使用优先级表显示它们。

E → E + T|T

T → T ∗ F|F

F → (E)|id

解决方案


+*()ID$
+.>.<<。.><。.>
*.>.><。.><。.>
(<。<.<。=.<。
).>.>
.>
.>
ID.>.>
.>
.>
$<。<.<。
<。