【问题标题】:Segmentation Fault after assignment statement(lex and yacc)赋值语句后的分段错误(lex 和 yacc)
【发布时间】:2014-03-04 01:22:20
【问题描述】:

这段代码运行良好。编译 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;

}

【问题讨论】:

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

标签: c compiler-construction yacc lex


【解决方案1】:

(我将此标记为“不可重现”,因为修复非常简单;但是该标记现在已超时/老化。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;}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多