首先是一些比较重要的需要考虑的内容:
1. 减号优先级的处理
通过%left、%right和%nonassoc对终结符的结合性进行规定,其中%left表示左结合,%right表示右结合,%nonassoc表示不可结合。
2. 嵌套if-else移入规约冲突(也被称为“悬空else”):
显式地解决悬空else问题可以借助于算符优先级。Bison源代码中每一条产生式后面都可以紧跟一个%prec标记,指明该产生式的优先级等同于一个终结符。下面这段代码通过定义一个比ELSE优先级更低的LOWER_THAN_ELSE算符,降低了规约相对于移入ELSE的优先级:
3. 错误恢复
一般把error放在例如行尾、括号结尾等地方,本质上相当于让行结束符“;”以及括号“{}”“()”等作为错误恢复的同步符号:
错误恢复还是比较难的,有的时候加上了错误恢复,反而会导致原来正确的报错。
下面的比较重要的就是如何创建语法树了,首先需要构造树结点结构:
1. 树结点结构