2013-10-16 141 views
3

我在寫一個基於.gertrude esolang的簡單計算器。我試圖做的是解析一個文本文件,其中包含比率(以n/m的形式)與flex,比檢查比率是一個操作的索引(+ -/*)或一個數字和發送Bison的正確標記。代碼編譯時沒有錯誤,但程序運行時會返回一個分段錯誤核心轉儲 - 用於每種輸入(如1/2 14/10 1/8應該是2 + 8)。Flex/Bison:分割故障核心轉儲

這裏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

請注意標註。 Flex適用於Apache/Adob​​e UI框架。 Flex-lexer用於詞法分析器。 – JeffryHouser

+0

對不起,謝謝你的提示;我剛剛選擇了盒子下面的建議! – thebeefeater

+0

重複http://stackoverflow.com/questions/8957829 – stackoverflow

回答

5

你的代碼有指針和字符串的問題。這是C問題,而不是Bison或Flex問題。

看看從gertrude.l這些行:

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

你的指針變量熟食店是未初始化的並且包含垃圾,所以它可能指向任何地方。然後你沿着指向它指向的地方(任何地方!),然後你在那裏放置一個角色。這會導致程序崩潰。再加上字符串(無論它在哪裏)都不是NUL終止的。

只要這條線替換那些三行:

char *deli = "/"; 
+0

謝謝你隊友!那是錯誤!現在它工作正常!今天學到的經驗:永遠在宣傳你所宣佈的東西!再次,謝謝! – thebeefeater