C Bison解析全局变量和函数

C Bison解析全局变量和函数,c,parsing,compiler-construction,grammar,bison,C,Parsing,Compiler Construction,Grammar,Bison,我构建一个编译器是为了好玩,目前我一直在研究当多个全局变量或函数定义在一个文件f.e中时如何解析 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_STMN

我构建一个编译器是为了好玩,目前我一直在研究当多个全局变量或函数定义在一个文件f.e中时如何解析

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条全局语句的想法

“yacc解析器使用的算法鼓励所谓的左递归语法规则。以下形式的规则与此算法匹配:

第一条规则仅适用于第一项;第二条规则适用于第二项和所有后续项。”

因此,您应该将规则写为:

GLOB_LIST : GLOB_STMNT {  }
          | GLOB_LIST GLOB_STMNT {  }
          ;

你为什么不把所有规则都打印出来?它可以显示正在发生的事情。你能不能也给我一个脚本?我们可能还想看看lexer的定义。@PaulOgilvie我确实有print语句,根据它们,所有东西都能正确地进行lexer,语法也几乎是相应的。“真的就是这一点造成了麻烦。@PaulOgilvie对不起,我必须道歉,你是对的,我在另一条规则中犯了一个错误。”。我忘了检查分号,为什么你认为它只是减少了第一个声明?它将按顺序解析(并减少)所有
GLOB\u STMNT
(不打印任何内容),然后(仅)减少
ROOT
并打印您的消息。这仍然不起作用,它只使用给定规则中的第一条规则来减少。我的问题是,我在解析var\u decs lol时出错,所以它起作用了
GLOB_LIST : GLOB_STMNT {  }
          | GLOB_LIST GLOB_STMNT {  }
          ;