野牛语法执行顺序
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
之前甚至已经看到了。
我有这样的语法:
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
之前甚至已经看到了。