我整天都在解决这个问题而且我无法弄清楚出了什么问题。
我们说我有这段代码:
%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
extern int error;
extern int yylineno;
extern char *yytext;
int errors = 0;
%}
%start main_struct
%token INT 1
%token COMMA 2
%token LEFT_PARENTHESIS 3
%token RIGHT_PARENTHESIS 4
%token K_BEGIN 5
%token END 6
%%
main_struct: functions_declaration
;
functions_declaration: function
| functions_declaration function
;
function: data_type identifier1 LEFT_PARENTHESIS vars_in_func RIGHT_PARENTHESIS
K_BEGIN function_body END;
vars_in_func: /*empty*/
| vars_in_f
;
vars_in_f: data_type identifier1
| vars_in_f COMMA data_type identifier1
;
function_body: /*empty*/
;
data_type: INT
;
identifier1: IDENTIFIER
| identifier1 COMMA IDENTIFIER
;
%%
int main ()
{
if (yyparse() == 0 && error==0){
printf("Accepted\n");
}
else{
printf("Rejected\n");
}
}
yyerror(char *s){
printf ("%s:at line %d\n", s,yylineno);
errors++;
}
当我在这个表达式上尝试时:int foo(int x,int y)begin end
它认识到&#34; int&#34; &#34;富&#34; &#34;(&#34;然后报告有错误。为什么不可接受?
答案 0 :(得分:1)
尝试将vars_in_func
和vars_in_f
替换为:
func_params:
/* empty */
| param_list
;
param_list:
data_type identifier1
| param_list COMMA data_type identifier1
;
显然,我已经稍微更改了命名(您需要与function
的定义进行协调)。我不理解你对identifier1
的定义,因为它允许用逗号分隔多个标识符,这对我来说没有意义。