野牛:表情失灵

时间:2014-05-25 20:07:08

标签: bison

我整天都在解决这个问题而且我无法弄清楚出了什么问题。

我们说我有这段代码:

%{
    #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;然后报告有错误。为什么不可接受?

1 个答案:

答案 0 :(得分:1)

尝试将vars_in_funcvars_in_f替换为:

func_params:
    /* empty */
  | param_list
  ;

param_list:
    data_type identifier1
  | param_list COMMA data_type identifier1
  ;

显然,我已经稍微更改了命名(您需要与function的定义进行协调)。我不理解你对identifier1的定义,因为它允许用逗号分隔多个标识符,这对我来说没有意义。