我的代码上出现了此分段错误。似乎它出现在第一个变量声明之后。任何想法如何摆脱这个错误?这是我的代码的一部分。
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();
}
答案 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
完成后不要忘记释放已分配的内存。