[질문] 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
이라고 뜨고
그후론 입력이 안먹힙니다.
댓글 달기