我正在构建一个有趣的编译器,并且我目前停留在如何解析单个文件中有多个全局变量或函数定义的情况下。
int a;
int b;
int main(){
int c;
}
我的野牛文件(简体)如下:
ROOT : GLOB { printf("%s\n", "ACCEPTED" }
;
VAR_DEC // Assume this matches correctly
FUNC_DEF // Assume this matches correctly
GLOB_STMNT : VAR_DEC { }
| FUNC_DEF { }
;
GLOB_LIST : GLOB_LIST GLOB_STMNT { }
| GLOB_STMNT { }
;
GLOB : GLOB_LIST { }
;
我的问题是,它将始终只减少firstvar声明,然后接受打印。是否有关于如何优化最后3条规则,以便减少所有3条全局语句的想法?
答案 0 :(得分:0)
“ yacc解析器使用的算法鼓励使用所谓的左递归语法规则。以下形式的规则与该算法匹配:
seq : item
| seq item
;
仅对第一项减少第一条规则;而第二个规则和所有后续项的第二个规则都会减少。”
因此,您应该将规则写为:
GLOB_LIST : GLOB_STMNT { }
| GLOB_LIST GLOB_STMNT { }
;