2014-03-04 39 views
1

这段代码工作得很好。在编译lex和yacc之后,代码能够进行基本的算术运算,甚至在被要求时也能回应变量的值。唯一的问题是赋值语句。赋值语句(lex和yacc)后的分段错误

如果我想说,做A = 12,然后键入A来查看它的值,程序崩溃,我得到了分段错误。如何确保我的分配报表正常工作,以及如何避免此分段错误?

这里是我的代码:

//lex file 

/*Lex input specification*/ 
%{ 
#include <stdlib.h> 
#include <stdio.h> 
#include "y.tab.h" 
void yyerror(char*); 
%} 

%% 
" "    ; 

[A-Z]    { yylval = *yytext-'a'; return VARIABLE;} 

[0-9]+([0-9])*   { yylval=atoi(yytext); return INTEGER;} 

[-/+()=*\n]   { return *yytext;} 


[\t]    ; 

.    { yyerror("invalid character");} 
%% 

int yywrap(void) { return 1;} 

而YACC文件:

/*yacc*/ 

%token INTEGER VARIABLE 
%left '|' 
%left '&' 
%left '+' '-' 
%left '*' '/' 
%left UMINUS 



%{ 
    void yyerror(char*); 
    int yylex(void); 
    int sym[26]; 

    #include <stdio.h> 
    #include <string.h> 
    #include <stdlib.h> 

%} 

%% 

program: 
     program statement '\n' 
     | 
     ; 
statement: 
     expr   {printf("%d\n",$1);} 
     | VARIABLE '=' expr  {sym[$1] = $3;} 
     ; 

expr: 

     INTEGER   {$$ = $1;} 
     | VARIABLE  {$$ = sym[$1];} 
     | expr '*' expr  {$$ = $1 * $3;} 
     | expr '/' expr  {$$ = $1/$3;} 
     | expr '+' expr  {$$ = $1 + $3;} 
     | expr '-' expr  {$$ = $1 - $3;} 
     | '(' expr ')'  {$$ = $2;} 
     ; 
%% 

void yyerror(char*s) { 
    fprintf(stderr, "%s\n", s); 
} 

int main(void) { 
    yyparse(); 
    return 0; 

} 
+1

也许'* yytext中,'A'' – BLUEPIXY

+0

这做到了。谢谢! –

+0

INTEGER规则的'([0-9])*'部分是多余的。 – EJP

回答