此代码完美无缺。在编译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;
}
答案 0 :(得分:0)
(我将此标记为“不可复制”,因为修复程序非常简单;但是标记现在已经超时/老化了。I'll answer instead so it is not shown as an open unanswered question)。
正如@BLUEPIXY所说:
也许
*yytext-'A'
澄清的是,lex规则:
[A-Z] { yylval = *yytext-'A'; return VARIABLE;}