Yacc flex gcc

编译打包和其他
回复
linuxpingwp
帖子: 1
注册时间: 2012-03-20 21:15

Yacc flex gcc

#1

帖子 linuxpingwp » 2012-03-20 21:18

词法文件:

%{
/*
It is a test here.
*/

#include "y.tab.h"

#define LOOKUP 0
#define NOT_FOUND 1

int state;
%}

%%
[\n ]+ {state=LOOKUP;}
\.\n {state=LOOKUP;return 0;}
^verb {state=VERB;}
^noun {state=NOUN;}
^adj {state=ADJECTIVE;}
^adv {state=ADVERB;}
^prep {state=PREP;}
^pron {state=PRON;}
^conj {state=CONJ;}

[a-zA-Z0-9]+ {
if (state==LOOKUP){
int s=lookup_word(yytext);
switch(s){
case LOOKUP: break;
case NOT_FOUND: break;
case VERB: return(VERB);
case NOUN: return(NOUN);
case ADJECTIVE: return(ADJECTIVE);
case ADVERB:return(ADVERB);
case PREP:return(PREP);
case PRON:return(PRON);
case CONJ:return(CONJ);
default: printf("%s: cannt be recognized.",yytext);
}
}else{
add_word(state,yytext);
}

}

. {ECHO;}

%%

typedef struct _word {
char *word_name;
int type;
struct _word *next;
} word,*pword;


word * word_list;

extern void *malloc();

int add_word(int type,char *word_name){
if (lookup_word(word_name) != NOT_FOUND) {return 0 ;}
word * w=(word *)malloc(sizeof(word));
w->word_name=(char*)malloc(strlen(word_name)+1);
strcpy(w->word_name,word_name);
w->type=type;

w->next=word_list;
word_list=w;
return 1;
}

int lookup_word(char * word_name){
word * w=word_list;
while(w){
if (strcmp(w->word_name,word_name)==0) {
return w->type;
}
w=w->next;
}
return NOT_FOUND;
}


======================语法文件==========

%{
#include <stdio.h>
//extern char *yytext;
%}

%token VERB ADJECTIVE ADVERB NOUN PREP PRON CONJ

%%
sentence: simple_sentence {printf("a simple sentence.\n");}
|compound_sentence {printf("a compound sentence.\n");}

simple_sentence: subject verb object|subject verb object prep_phrase

compound_sentence: simple_sentence CONJ simple_sentence|simple_sentence CONJ compound_sentence

subject: NOUN|PRON|ADJECTIVE subject

verb: verb VERB|ADVERB VERB|VERB

object: NOUN|ADJECTIVE object

prep_phrase: PREP NOUN

%%

extern FILE *yyin;
//extern char *yytext;

int main(int argc,char *argv[]){
while (!feof(yyin)){
yyparse();
}
}

yyerror(s)
char *s;
{
printf("Error: %s.\n",s);
}
=================编译过程==============

cd 文件目录

flex test.l

bison -d test.y 或 yacc -d test.y

gcc lex.yy.c test.tab.c -ll -o test.exe

之后执行test.exe,报错 segmentation fault

不知何解?请教.
回复