野牛语法执行顺序

问题描述 投票:0回答:1

我有这样的语法:

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

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

输入a和b以及b和b

输出:1230

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

bison yacc
1个回答
0
投票

使用左递归代替右递归。

野牛完全按照您的指示执行操作。每个非终端程序的动作都会在非终端程序完成后立即执行。

如果使用右递归规则:

B: "and" b B

然后,外部B的动作将打印b的语义值,在内部B的动作之后执行,该动作将打印随后的b的语义值。

一种更自然的书写语法的方式,它具有产生正确关联性的进一步优势,是:

A: a
 | A "and" b

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

© www.soinside.com 2019 - 2024. All rights reserved.