我有这样的语法:
A : a B {int i = 0; printf("%d",i);};
B: and b B {i++; printf("%d",i);}
| %empty
;
输入a和b以及b和b
输出:1230
我的问题是:如何将执行顺序更改为0123
使用左递归代替右递归。
野牛完全按照您的指示执行操作。每个非终端程序的动作都会在非终端程序完成后立即执行。
如果使用右递归规则:
B: "and" b B
然后,外部B
的动作将打印b
的语义值,在内部B
的动作之后执行,该动作将打印随后的b
的语义值。
一种更自然的书写语法的方式,它具有产生正确关联性的进一步优势,是:
A: a
| A "and" b
此外,该语法中的动作将从左到右执行,因为内部A
的动作会在完成后立即执行,这是在关联的b
还未被看到之前。