Compiler construction 野牛在代码中向前看

Compiler construction 野牛在代码中向前看,compiler-construction,bison,yacc,Compiler Construction,Bison,Yacc,我正在使用Bison编写一个编译器,它将把一个简单的编程语言转换成一些寄存器机器的指令,这些寄存器机器只有一个累加器。我想节省一些加载和保存值的时间。我的野牛代码如下所示: ID ASSIGN expression { if(id_exists($1)) { addCode("STORE ", getAdress($1));

我正在使用Bison编写一个编译器,它将把一个简单的编程语言转换成一些寄存器机器的指令,这些寄存器机器只有一个累加器。我想节省一些加载和保存值的时间。我的野牛代码如下所示:

ID ASSIGN expression { 
                        if(id_exists($1))
                        {
                            addCode("STORE ", getAdress($1));
                        } 
                        else
                            YYERROR;
                     }
(Here A is assigned 1000)
STORE a_adress;
SHL
STORE b_adress
SHR
STORE b_Adress
例如,给定以下输入:

a ASSIGN 1000;
b ASSSIGN a * 2;
b ASSIGN  b / 2;
我的编译器的输出如下所示:

ID ASSIGN expression { 
                        if(id_exists($1))
                        {
                            addCode("STORE ", getAdress($1));
                        } 
                        else
                            YYERROR;
                     }
(Here A is assigned 1000)
STORE a_adress;
SHL
STORE b_adress
SHR
STORE b_Adress

很明显,中间的
存储
是不需要的,但是我怎么知道在下一个操作中,我会将
b
作为操作数之一,这样我就可以避免这个
存储
操作了?

这对bison来说不是一个好任务。您将希望在第二次遍历生成的代码时进行分析和优化。可能会给你一些想法。是否可能只使用野牛?什么是“只使用野牛”?bison文件中的大部分代码都是C语言;显然,可以用C语言解决这个问题,因此可以将解决方案嵌入bison。这并不是bison的自然用法,因为bison是一种解析工具,不是用来分析解析、生成代码或优化它的,但我敢肯定,您可以充分歪曲bison的描述,从而能够声称您在“bison”中进行了窥视孔优化。但野牛决不会帮助你。我将坚持我最初的表述:“这对野牛来说不是一个好任务。”