0

我试图使用 flex 和 yacc 实现编译器。当我使用 yyparse() 控制台返回“核心转储的分段错误”。如何解决这个问题?

int main(int argc, char *argv[])
{
    char *sourcefile = (char *) calloc(strlen(argv[1]), sizeof(char));
    strcpy(sourcefile, argv[1]);

    yyin = fopen(sourcefile, "r");

    listing = stdout; /* send listing to screen */
    yyrestart(yyin);
    yyparse();

    fclose(yyin);

    return 0;
}

编译中的警告:

parse.y: In function ‘yyparse’:
parse.y:103:19: warning: assignment makes pointer from integer without a cast [enabled by default]
  | OP_SREDNIK {$$ = OP_SREDNIK;}
                   ^
parse.y:104:19: warning: assignment makes pointer from integer without a cast [enabled by default]
  | READ ID OP_SREDNIK {$$ = READ;}
                   ^
parse.y:107:19: warning: assignment makes pointer from integer without a cast [enabled by default]
  | ZWROC OP_SREDNIK {$$ = ZWROC;}
                   ^
parse.y:114:19: warning: assignment makes pointer from integer without a cast [enabled by default]
  | THIS {$$ = THIS;}
                   ^
parse.y:115:19: warning: assignment makes pointer from integer without a cast [enabled by default]
  | SUPER {$$ = SUPER;}
                   ^
parse.y:121:19: warning: assignment from incompatible pointer type [enabled by default]
  | WyrazeniePostfiksowe OP_KROPKA ID {$$ = $3;}

解析.y (yacc)

Instrukcja : Wyrazenie OP_SREDNIK {$$ = $1;}
    | ZlozonaInstrukcja OP_SREDNIK {$$ = $1;}
    | WyrazeniePostfiksowe OP_PRZYPISANIA Wyrazenie OP_SREDNIK {$$ = $3;}
    | Blok {$$ = $1;}
    | DELETE Wyrazenie OP_SREDNIK {$$ = $2;}
    | OP_SREDNIK {$$ = OP_SREDNIK;}
    | READ ID OP_SREDNIK {$$ = READ;}
    | WRITE Wyrazenie OP_SREDNIK {$$ = $2;}
    | ZWROC Wyrazenie OP_SREDNIK {$$ = $2;}
    | ZWROC OP_SREDNIK {$$ = ZWROC;}
;
4

0 回答 0