0

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

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 ';' ;

为什么它不认识它?

4

3 回答 3

1

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

在每个规则之后,添加一条printf语句,告诉您该规则已匹配。在这里查看我的答案以获取提示。然后通过语法运行你的输入,看看它在做什么。

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

于 2009-11-25T07:56:29.403 回答
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();};

类型说明符:INT | 空白 ;

于 2009-11-24T12:13:36.667 回答
-1

只是看着你有的线

local_declarations : local_declarations var_declaration
                   | /* 空的 */ ;

那条线对我来说看起来很麻烦,因为你把它当作一个递归语句......

希望这能给你提示,最好的问候,汤姆。

于 2009-11-24T11:12:29.833 回答