Yacc程序无法识别函数声明

时间:2009-11-24 10:58:08

标签: compiler-construction function grammar yacc context-free-grammar

我认为我的程序应该能够将以下内容识别为函数声明:

int fn(int i) { int n; return; }

但事实并非如此。

以下是我的yacc文件的相关部分:

program : declaration_list ; 

declaration_list : declaration_list declaration | declaration ;

declaration : var_declaration 
            | fun_declaration 
            | '$' { printTable();};

var_declaration : type_specifier ID ';' {$2->value = 0; $2->arraysize = 0;};
                | type_specifier ID '[' NUM ']' ';' {$2->arraysize = $4;printf("Array size is %d", $2->arraysize);} ;

type_specifier : INT | VOID ;

fun_declaration : type_specifier ID '(' params ')' compound_stmt {printf("function declaration\n"); printf("Parameters: \n", $2->args); } ;


params : param_list | VOID ;

param_list : param_list ',' param
           | param ;

param : type_specifier ID | type_specifier ID '[' ']' ;

compound_stmt : '{' local_declarations statement_list '}' {printf("exiting scope\n"); } ;

local_declarations : local_declarations var_declaration
                   | /* empty */ ;

statement_list : statement_list statement
               | /* empty */ ;

statement : expression_stmt
          | compound_stmt
          | selection_stmt
          | iteration_stmt
          | return_stmt ;

expression_stmt : expression ';'
                | ';' ;

selection_stmt : IF '(' expression ')' statement
               | IF '(' expression ')' statement ELSE statement ;

iteration_stmt : WHILE '(' expression ')' statement ;

return_stmt : RETURN ';' | RETURN expression ';' ;

为什么不认识它?

3 个答案:

答案 0 :(得分:1)

这不是您问题的答案,而是调试的建议。

在每个规则之后,添加一个printf语句,告诉您规则已匹配。请查看my answer here以获取提示。然后通过语法运行输入,看看它在做什么。

提出问题的另一个提示是尝试将问题简化为最简单的情况,以重现错误。在上述语法的情况下,在发布之前删除您不希望与此特定示例匹配的所有规则。另外,使用%token声明发布一个完整的程序,以便人们可以编译并自行尝试。更好的是发布词法分析器。

答案 1 :(得分:0)

我认为你需要这样的东西:

declaration : type_specifier ID ';' {$2->value = 0; $2->arraysize = 0;};
            | type_specifier ID '[' NUM ']' ';' {$2->arraysize = $4;printf("Array size is %d", $2->arraysize);} ;
            | type_specifier ID '(' params ')' compound_stmt {printf("function declaration\n"); printf("Parameters: \n", $2->args); } ;

            | '$' { printTable();};

type_specifier:INT | VOID;

答案 2 :(得分:-1)

只看你所在的行

local_declarations : local_declarations var_declaration
                   | /* empty */ ;

这条线对我来说很麻烦,因为你有一个像递归声明......

希望这会给你提示, 最好的祝福, 汤姆。