我认为我的程序应该能够将以下内容识别为函数声明:
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 ';' ;
为什么不认识它?
答案 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 */ ;
这条线对我来说很麻烦,因为你有一个像递归声明......
希望这会给你提示, 最好的祝福, 汤姆。