저는 .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);
}
덕분에!
이 태그의주의하십시오. Flex는 Apache/Adobe UI 프레임 워크 용입니다. Flex-lexer는 어휘 분석기 용입니다. – JeffryHouser
팁에 대해 죄송합니다. 상자 아래에 제안 된 것을 골라 냈습니다! – thebeefeater
중복 된 http://stackoverflow.com/questions/8957829 – stackoverflow