分段故障yacc / lex

时间:2014-12-21 19:31:19

标签: yacc lex

我的代码上出现了此分段错误。似乎它出现在第一个变量声明之后。任何想法如何摆脱这个错误?这是我的代码的一部分。

lex档案:

%{
#include <stdio.h>
#include "comp-func.h"
#include "y.tab.h"
struct var *create_var(char *s);
%}

%%

"int" {yylval.array = strdup(yytext); return INT;}
0|-?[1-9][0-9]* {yylval.number = atoi(yytext); return INT_NO;}
"main()" {yylval.array = strdup(yytext); return BGIN;}
[_a-zA-Z][_a-zA-Z0-9]* {struct var *vr;
            vr = create_var(yytext);
            yylval.variable = vr; 
            return ID;}
[ \t] ;
\n {yylineno++;}
. {return yytext[0];}

%%

struct var *create_var(char *s)
{
    struct var *vr;
    vr->var_value = 9999;
    vr->var_name = strdup(s);
    vr->next = NULL;
    return vr;
}

yacc文件:

%{
#include <stdio.h>
#include <string.h>
#include "comp-func.h"
extern FILE* yyin;
extern char* yytext;
extern int yylineno;
void add_var(struct var *vari);
void print_var(char *var);
int lookup_var(char *var);
%}

%union {
    int number;
    char *array;
    struct var *variable;
}

%token <array> INT 
%token <number> INT_NO 
%token <variable> ID 
%token <array> BGIN
%start progr

%left '-' '+'
%left '*' '/'

%type <number> expr

%%

progr: declaratii bloc {printf("ok\n");}
     ;

declaratii : declaratie_variabila ';'
       | declaratii declaratie_variabila ';'
       ;

declaratie_variabila : INT ID {if(lookup_var($2->var_name)==0)
                                    add_var($2);
                               else 
                               {
                                    printf("Variable -- %s -- is already defined\n",$2->var_name);
                                    return 0;
                               }
                              } 
                 ; 

/* bloc */
bloc : BGIN '{' list '}'  
     ;

/* lista instructiuni */
list : statement ';'
     | list statement ';' 
     ;

/* instructiune */
statement : declaratie_variabila
      | ID '=' expr {if(lookup_var($1->var_name)==0)
             {  
                printf("Variable -- %s -- is not defined\n",$1->var_name);
                return 0;
             }
             else $1->var_value = $3;
            }
          ;

expr : INT_NO
     | expr '+' expr        { $$ = $1 + $3; }
     | expr '-' expr        { $$ = $1 - $3; }
     | expr '*' expr       { $$ = $1 * $3; }
     | expr '/' expr        { $$ = $1 / $3; }
     | '(' expr ')'        { $$ = $2; }
     ;

%%

void add_var(struct var *vari)
{
    struct var *vr;

    vr->next = var_list;

    strcpy(vr->var_name,vari->var_name);

    vr->var_value = vari->var_value;    

    var_list = vr;
}

int yyerror(char * s){
printf("eroare: %s la linia:%d\n",s,yylineno);
}

int main(int argc, char** argv){
yyin=fopen(argv[1],"r");
yyparse();
} 

1 个答案:

答案 0 :(得分:1)

create_var

struct var *create_var(char *s)
{
    struct var *vr;
    vr->var_value = 9999;

vr未初始化,然后您立即尝试使用它,就像它指向已分配的内存一样。这是未定义的行为(使用未初始化的变量)和分段错误很可能。

你可能意味着:

struct var *vr = malloc(sizeof *vr);

另外:

  • 不要忘记检查以确保malloc没有返回NULL

  • 完成后不要忘记释放已分配的内存。