野牛语法执行顺序

bison grammar execution order

我有这样的语法:

A : a B {int i = 0; printf("%d",i);};

B: and b B {i++; printf("%d",i);}
 | %empty 
 ;

输入a and b and b and b

输出:1230

我的问题是:如何将执行顺序更改为 0123

使用左递归代替右递归。

Bison 完全按照您告诉它的方式执行操作。每个非终端的动作都在非终端完成后立即执行。

如果使用右递归规则:

B: "and" b B

然后外部 B 的动作,它打印 b 的语义值,在内部 B 的动作之后执行,它打印 B 的语义值=13=]随后。

编写该语法的更自然的方法是:

A: a
 | A "and" b

此外,该语法中的动作将从左到右执行,因为内部 A 的动作在完成后立即执行,这是在关联的 b 之前甚至已经看到了。