C中的Flex Bison分段故障

时间:2013-08-25 20:10:28

标签: c segmentation-fault bison yacc flex-lexer

当我在Mac上编译代码时,我一直得到“分段错误:11”,但它在Windows上工作正常,如果您能看一下并帮助我解决问题,我将非常感激。 提前致谢, 弗朗西斯:D

mylang.l代码:

    %{

#include <stdio.h>
#include <string.h>
#include "lang.tab.h"

int lineno = 1;

%}
%%

"print"                     return PRINT;
[0-9]+                      yylval=atoi(yytext); return NUMBER;
\".*\"                      yylval=strdup(yytext); return STRING;
\"                          return QUOTE;
\;                          return SEMICOLON;
[a-zA-Z][a-zA-Z0-9]*        lineno++; yylval=strdup(yytext); return VARIABLE;
[\n]                        ;
"/*"([^*]|\*+[^*/])*\*+"/"  ;
[ \t]                       ;

"="                         return EQUALS;
"+"                         return PLUS;
"-"                         return MINUS;
"*"                         return MUL;
"/"                         return DIVIDE;
"%"                         return MODULUS;

.                           { printf("Error on line: %d", lineno); return 1; }

%%

mylang.y代码:

    %{
#include <stdio.h>
#include <string.h>
#include <math.h>

extern FILE *yyin; /* Input for yacc parser. */
#ifdef YYTEXT_POINTER
extern char *yytext; /* Current symbol for error reporting. */
#else
extern char yytext[];
#endif
extern int yylex(void); /* Lexical analyzer function. */
extern int yyparse(void); /* Parser function. */

int yydebug=0;

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

int yywrap()
{
    return 1;
}


int main(int argc, char *argv[]) {
    if (argc > 1)
        {
        yyin = fopen(argv[1], "r");
        yyparse(); /* Calls yylex() for tokens. */
        }
    else
        printf("syntax: %s filename\n", argv[0]);
    return 0;
    }

/* Custom functions for language will go here*/


/* and end here */
%}

%token PRINT 
%token QUOTE 
%token SEMICOLON 
%token STRING
%token NUMBER
%token EQUALS
%token VARIABLE

%token PLUS
%token MINUS
%token MUL
%token DIVIDE
%token MODULUS

%left PLUS MINUS
%left MUL DIVIDE MODULUS

%start program       

%%

program:        /* empty */
                |
                program line
                ;

line:           stmt
                ;

end_stmt:       SEMICOLON
                ;

expr:           NUMBER
                { $$ = $1; }
                |
                expr PLUS expr
                { $$ = $1 + $3; }
                |
                expr MINUS expr
                { $$ = $1 - $3; }
                |
                expr MUL expr
                { $$ = $1 * $3; }
                |
                expr DIVIDE expr
                { $$ = $1 / $3; }
                |
                expr MODULUS expr
                { $$ = $1 % $3; }
                ;

var:            VARIABLE
                { $$ = $1; }
                ;

var_assignment: var EQUALS expr
                { varCounter($1); updateSymbolTable($1);  }
                ;

stmt:           print_stmt end_stmt
                |
                var_assignment end_stmt
                ;

print_stmt:     PRINT STRING
                { printf("%s", $2); }
                |
                PRINT expr
                { printf("%d", $2); }
                ;

%%

1 个答案:

答案 0 :(得分:4)

您假设yylval可以包含指针(指向字符串)或整数。 yylval的默认类型是int,因此在指针与整数大小相同的平台上,事情可以正常工作。在指针较大的平台上,指针将被破坏并尝试取消引用它将导致段错误。

你不收到编译警告吗?