我正在写一个基于.gertrude esolang的简单计算器。我想做的是用flex解析一个包含比率(以n/m形式)的文本文件,然后检查比率是否是一个操作的索引(+-/*)或一个数字,然后发送Bison的正确代币。编译代码时没有错误,但是程序运行时针对每种输入(例如1/2 14/10 1/8应该为2 + 8)返回-segmentation故障核心转储。

在这里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);
}

在此先感谢您提供任何建议!

最佳答案

您的代码中的指针和字符串有问题。这是C问题,不是Bison或Flex问题。

查看来自gertrude.l的这些行:

char *deli;
const char del = '/';
*deli = del;

您的指针变量 deli 未初始化并包含垃圾,因此它可能指向任何地方。然后,您沿着该指针指向它所指向的位置(任何地方!),然后在其中放置一个字符。这会导致程序崩溃。再加上字符串(无论它在哪里)都不是NUL终止的。

只需用以下行替换这三行:
 char *deli = "/";

关于c - Flex/野牛: segmentation fault core dump,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19400553/

10-11 15:13