当我在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); }
;
%%
答案 0 :(得分:4)
您假设yylval
可以包含指针(指向字符串)或整数。 yylval
的默认类型是int
,因此在指针与整数大小相同的平台上,事情可以正常工作。在指针较大的平台上,指针将被破坏并尝试取消引用它将导致段错误。
你不收到编译警告吗?