gpt4 book ai didi

c - 赋值语句后的段错误(lex 和 yacc)

转载 作者:太空宇宙 更新时间:2023-11-04 04:44:57 24 4
gpt4 key购买 nike

这段代码工作得很好。编译完 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;

}

最佳答案

(我将此标记为“不可重现”,因为修复非常简单;但是该标记现在已超时/老化。I'll answer instead so it is not shown as an open unanswered question)。

正如@BLUEPIXY 指出的那样:

maybe *yytext-'A'

澄清一下,这是 lex 规则:

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

关于c - 赋值语句后的段错误(lex 和 yacc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22161055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com