2013-10-16 5 views
3

저는 .gertrude esolang을 기반으로 간단한 계산기를 작성하고 있습니다. 내가 뭘하려고하는지 비율이 작업 (+ -/*) 또는 숫자에 대한 인덱스 및 전송 여부를 확인하는 것보다 flex를 사용하여 비율 (n/m 형식)이 포함 된 텍스트 파일을 구문 분석하는 것입니다. 바이슨에게 맞는 토큰. 코드를 컴파일 할 때 오류는 발생하지 않지만 프로그램이 실행될 때 모든 종류의 입력 (예 : 1/14/10 1/8이 2 + 8이어야 함)에 대해 -segmentation fault 코어 덤프를 반환합니다. 여기 gertrude.l 여기 gertrude.yFlex/Bison : 세분화 오류 코어 덤프

%{ 
#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; 

} 

조언 모든 종류의 사전에

%{ 
#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/Adobe UI 프레임 워크 용입니다. Flex-lexer는 어휘 분석기 용입니다. – JeffryHouser

+0

팁에 대해 죄송합니다. 상자 아래에 제안 된 것을 골라 냈습니다! – thebeefeater

+0

중복 된 http://stackoverflow.com/questions/8957829 – stackoverflow

답변

5

코드에 포인터 및 문자열에 문제가 있습니다. 이는 Bison이나 Flex 문제가 아니라 C 문제입니다. gertrude.l에서이 라인에서

봐 :

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

귀하의 포인터 변수 델리가 초기화되지 않은이며 어디 가리킬 수 있도록, 쓰레기가 포함되어 있습니다. 그런 다음 포인터가 가리키는 위치 (아무 데나!)에 따라 포인터를 따라 가면 거기에 캐릭터를 넣을 수 있습니다. 이로 인해 프로그램이 중단됩니다. 더하여 문자열 (그것이있는 곳)은 NUL로 끝나지 않습니다.

간단히이 줄을 그 세 줄을 바꿉니다

char *deli = "/"; 
+0

친구 사귈 주셔서 감사합니다! 그것은 오류였다! 이제 제대로 작동합니다! 오늘 배운 교훈 : 항상 선언 한 것을 초기화하십시오! 다시 고마워! – thebeefeater