Bison 野牛:表达障碍

Bison 野牛:表达障碍,bison,Bison,4.我整天都在琢磨这个问题,不知道出了什么问题 假设我有以下代码: %{ #include <stdio.h> #include <string.h> #include <stdlib.h> extern int error; extern int yylineno; extern char *yytext; int errors = 0; %} %start main_struct

4.我整天都在琢磨这个问题,不知道出了什么问题

假设我有以下代码:

%{
    #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++;
}
%{
#包括
#包括
#包括
外部-内部错误;
外部内部yylineno;
外部字符*文本;
整数误差=0;
%}
%启动主结构
%令牌INT 1
%标记逗号2
%标记左括号3
%标记右括号4
%令牌K_开始5
%令牌端6
%%
主结构:函数声明
;
函数\声明:函数
|函数\声明函数
;
函数:数据类型标识符1左括号变量在右括号中
K_BEGIN函数_body END;
vars_in_func:/*空*/
|变量
;
变量输入:数据类型标识符1
|逗号数据类型标识符1中的变量
;
函数体:/*空*/
;
数据类型:INT
;
标识符1:标识符
|标识符1逗号标识符
;
%%
int main()
{     
如果(yyparse()==0&&error==0){
printf(“已接受的”);
}
否则{
printf(“拒绝”);
}
}
yyerror(字符*s){
printf(“%s:在第%d行\n”,s,yylineno);
错误++;
}
当我在这个表达式上尝试时:intfoo(intx,inty)begin-end


它识别出“int”“foo”(“然后报告有错误。为什么不可接受?

尝试用以下内容替换函数中的变量和函数中的变量:

func_params:
    /* empty */
  | param_list
  ;

param_list:
    data_type identifier1
  | param_list COMMA data_type identifier1
  ;

显然,我对命名做了一些更改(您需要与
函数的定义相协调)。我不理解您对
标识符1
的定义,因为它允许使用逗号分隔多个标识符,这在本文中没有意义。

@Victory抱歉,我不清楚。我的语法应该识别所有行,但它只识别前3个标记。int foo和(然后抛出错误..但我不明白为什么会这样做是的,最好看到错误的文本/输出。@Victory没有实际错误,但它是不可接受的。输出类似于:Token关键字:int-Token标识符:foo-Token左括号:(然后它停止了。这将接受一些不能被接受的句子。比如:int foo(,int x),因为param_列表可以是空的。但是即使这样,它也不能识别这个int foo(int x)。我真的不明白为什么…@Manos我不明白为什么你认为
参数列表可以为空。我的答案中肯定没有这样定义。无论如何,你应该编辑你的问题以显示你的当前代码,并包括所有内容,以便有人可以运行它。我更改了我的问题并提交了其他代码。是的,你是正确的ct您的代码是可以接受的。但是,它无法识别提交的代码>>int foo(int x)@Manos我不明白您在做什么。如果不定义
标识符
,您如何编译它?您的lexer在哪里?