2014-05-25 22 views
1

我在这个问题了一整天,我找不出什么是错的..野牛:表达故障

比方说,我有这样的代码:

%{ 
    #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)对开始结束

它承认 “INT” “富” “(” 然后报告存在错误,为什么不能接受?

+0

什么是错误? – Victory

+0

@胜利对不起,如果我不清楚。我的语法应该可以识别所有行但是它只识别前3个标记。 int foo和(然后抛出错误..但我不明白为什么它会这样做 – Manos

+0

是的,这将是很好的看到错误的文本/输出 – Victory

回答

1

尝试更换vars_in_funcvars_in_f本:

func_params: 
    /* empty */ 
    | param_list 
    ; 

param_list: 
    data_type identifier1 
    | param_list COMMA data_type identifier1 
    ; 

很显然,我已经改变了命名一点点(你需要与你的function定义坐标)。我不明白你的identifier1的定义,因为它允许用逗号分隔多个标识符,在这种情况下这对我来说是没有意义的。

+0

这将接受一些句子不能接受我爱:INT FOO(,诠释x)的自param_list可以是空的,但即使如此也不能识别这个int foo(int x)。我真的不明白为什么.. – Manos

+0

@Manos我不明白你为什么认为'param_list'可以是空的。在我的回答中没有这样定义。无论如何,你是应该编辑你的问题来显示你当前的代码,并且包含所有东西,以便有人能够运行它。 – ooga

+0

我改变了我的问题并提交了额外的代码。是的你是正确的你的代码是可以接受的。但是,它无法识别提交的代码>> int foo(int x)<<。关于我现在试图了解Bison的标识符,所以目前我将保持原样。但我不明白为什么在它已经识别第一个int的时候不会识别第二个int。 – Manos