Bison语法解析器使用指南:从基础到高级应用
1. 操作符优先级与结合性
操作符按照优先级递增的顺序进行声明。同一行声明的所有操作符具有相同的优先级。例如,Fortran语法可能包含以下内容:
%left '+' '-' %left '*' '/' %right POW这里优先级最低的操作符是+和-,中等优先级的是*和/,最高优先级的是POW,它表示**乘方操作符。
1.1 使用优先级和结合性解决冲突
语法中的每个符号都可以通过优先级声明分配一个优先级和结合性。每个规则也可以有优先级和结合性,它可以从规则中的%prec子句获取,若没有该子句,则从规则中最右边有优先级分配的符号获取。
当出现移进 - 归约冲突时,Bison会比较可能移进的符号和可能归约的规则的优先级。如果符号的优先级更高,就进行移进操作;如果规则的优先级更高,就进行归约操作。如果两者优先级相同,Bison会检查结合性。如果是左结合的,就进行归约;如果是右结合的,就进行移进;如果是非结合的,Bison会生成错误。
1.2 优先级的典型用途
理论上,你可以使用优先级来解决任何类型的移进 - 归约冲突,但你应该只在少数明确的情况下使用优先级,否则应重写语法。优先级声明主要用于处理表达式语法,这