나는 다음과 같은 코드에 대한 분할 오류 (코어 덤프) 받고 있어요 :다음 lex/yacc 파일에서 세그먼트 화 오류 (코어 덤프)가 수신됩니다. 그들에게 무슨 문제가 있습니까?
렉스 파일은 다음과 같다, test.l :
이%{
#include "y.tab.h"
#define LOOKUP 0
int state;
int add_word(int type, char *word);
int lookup_word(char *word);
%}
%%
\n {state = LOOKUP;}
\.\n {state = LOOKUP;
return 0;
}
^verb {state = VERB;}
^adj {state = ADJECTIVE;}
^adv {state = ADVERB;}
^noun {state = NOUN;}
^prep {state = PREPOSITION;}
^pron {state = PRONOUN;}
^conj {state = CONJUNCTION;}
[a-zA-Z]+ {
if(state != LOOKUP){
add_word(state, yytext);
}else{
switch(lookup_word(yytext)){
case VERB: return(VERB);
case ADJECTIVE: return(ADJECTIVE);
case ADVERB: return(ADVERB);
case NOUN: return(NOUN);
case PREPOSITION: return(PREPOSITION);
case PRONOUN: return(PRONOUN);
case CONJUNCTION: return(CONJUNCTION);
default:
printf("%s: don't recog\n",yytext);
}
}
}
. ;
%%
struct word{
char *word_name;
int word_type;
struct word *next;
};
struct word *word_list;
extern void *malloc();
int add_word(int type, char *word){
struct word *wp;
if(lookup_word(word) != LOOKUP){
printf("word %s already defined\n", word);
return 0;
}
wp = (struct word *) malloc(sizeof(struct word));
wp-> next = word_list;
wp-> word_name = (char*) malloc(strlen(word)+1);
strcpy(wp->word_name, word);
wp->word_type = type;
word_list = wp;
return 1;
}
int lookup_word(char *word){
struct word *wp = word_list;
for(; wp; wp = wp->next){
if(strcmp(wp->word_name, word) == 0)
return wp->word_type;
}
return LOOKUP;
}
Yacc에 파일이 다음과 같다,
test.y :
%{
#include <stdio.h>
%}
%token NOUN PRONOUN VERB ADVERB ADJECTIVE PREPOSITION CONJUNCTION
%%
sentence: subject VERB object {printf("sentence is valid\n");}
;
subject: NOUN
| PRONOUN
;
object: NOUN
;
%%
extern FILE *yyin;
main(){
while(!feof(yyin)){
yyparse();
}
}
yyerror(s)
{
fprintf(stderr, "some error\n");
}
나는 문제가 무엇인지 알아 내려고 시간 동안 노력했습니다. 나는이 책을 완전히 새롭게하고 책 "O'reilly-Lex and Yacc"을 따른다.
표준 함수의 프로토 타입 선언을 제공하지 말고 대신 올바른 헤더 파일을 포함하십시오. 또한 [malloc의 결과를 캐스팅하는 방법에 대한 설명] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)을 읽어보십시오. –
http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong – melpomene
문제는 디버거에서 실행하면 충돌이 어디에서 발생합니까? 호출 스택에 코드가 있습니까? 그리고 충돌을 일으키기 위해 입력 한 내용을 포함하도록 질문을 편집하십시오. –