[질문] flex와 bison 관련 질문입니다.
글쓴이: ddangkyoung / 작성시간: 금, 2009/11/06 - 12:23오전
도저히 원인을 모르겠습니다...
flex와 bison으로 기본적인 영어를 인식하는 lexer와 parser를 만들어봤습니다.
token외의 것을 입력하면 don`t recognized라는 문장이 잘 뜨는데
token 변수 이런식으로 add_word를 하려고 하면
syntax error 라는 말이 계속 뜨네요;
예를들어
verb is am are
라고 입력하면 verb 토큰에 해당하는 is am are가 리스트에 추가되고
다시
is 라고 입력하면 is를 verb 토큰으로 인식해야 되는데
여기서 syntax에러가 나버립니다.;
참고로 컴파일은
flex example.l
bison -d example.y
gcc -o example lex.yy.c example.tab.c -ly -lfl
이렇게 했고요
cygwin 환경입니다.
example.l 코드
%{ #include "example.tab.h" #define LOOKUP 0 int state; %} %% \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 recognize\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("!!! warning: 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->next) { if(strcmp(wp->word_name, word) ==0) return wp->word_type; } return LOOKUP; }
example.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() { do { yyparse(); }while(!feof(yyin)); } yyerror(s) char *s; { fprintf(stderr, "%s\n",s); }
Forums:
테스트한 입력
테스트한 입력 데이터를 보여주세요.
우선 각 품사별로 등록을 해놔야 문장 구문분석이 되는 구조인 것 같습니다.
네 그래서 아래처럼 입력했습니다.
커맨드 입력:
verb is am are
noun pig I
이런식으로 하는데
verb is am
정도만 해도
syntax error
이라고 뜨고
그후론 입력이 안먹힙니다.
댓글 달기