我正在写一个基于.gertrude esolang的简单计算器。我要做的是解析包含比率(以n / m形式)与flex的文本文件,而不是检查比率是否为操作的索引(+ - / *)或数字而不是发送对Bison的正确代币。编译代码时没有错误,但是当程序运行时,返回-segmentation fault core dump - 对于每种输入(如1/2 14/10 1/8应为2 + 8)。
这里是gertrude.l
%{
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "gertrude.tab.h"
void yyerror(char *);
int FrazioneToDecimale(char *str1){
int num, den;
unsigned tot;
char *token;
char *deli;
const char del = '/';
*deli = del;
token = strtok (str1, deli);
num = atoi(token);
token = strtok (NULL, deli);
den = atoi(token);
tot = 1 / (num/den);
return tot;
}
%}
%%
/* ratio */
"14/10" {
yylval.sval = '+';
return SOMMA;
}
"11/7" {
yylval.sval = '-';
return SOTTRAZIONE;
}
"6/16" {
yylval.sval = '*';
return MOLTIPLICAZIONE;
}
"5/8" {
yylval.sval = '/';
return DIVISIONE;
}
[0-9]+"/"[0-9]+ {
//yylval = *yytext ;
yylval.ival = FrazioneToDecimale(yytext);
return NUMERO;
}
[ \t] ;
[ \n] { return EOL; };
%%
int yywrap(void) {
return 0;
}
这里是gertrude.y
%{
#include <stdio.h>
#include <string.h>
%}
%union {
int ival;
char sval;
}
%type <ival> exp fattore termine
%token <ival> NUMERO
%token <sval> SOMMA SOTTRAZIONE MOLTIPLICAZIONE DIVISIONE
%token EOL
%%
istruzione:
| istruzione exp EOL { printf("= %d\n", $2); }
;
exp: fattore
| exp SOMMA fattore { $$ = $1 + $3; }
| exp SOTTRAZIONE fattore { $$ = $1 - $3; }
;
fattore: termine
| fattore MOLTIPLICAZIONE termine { $$ = $1 * $3; }
| fattore DIVISIONE termine { $$ = $1 / $3; }
;
termine: NUMERO { $$ = $1; }
;
%%
int main(void) {
yyparse();
}
yyerror(char *s) {
fprintf(stderr, "error: %s\n\n", s);
}
提前感谢任何建议!
答案 0 :(得分:5)
您的代码存在指针和字符串问题。这是一个C问题,而不是Bison或Flex问题。
从gertrude.l看看这些行:
char *deli;
const char del = '/';
*deli = del;
您的指针变量 deli 未初始化且包含垃圾,因此它可能指向任何位置。然后你按照指针指向它所指向的位置(任何地方!)并在那里放置一个角色。这会导致程序崩溃。加上字符串(无论它在哪里)都不是NUL终止的。
只需用这一行替换这三行:
char *deli = "/";