/* C code supplied at the beginning of the file. */ %{ #include #include extern int yylexlinenum; /* these are in YYlex */ extern char *yytext; /* current token */ %} /* Keywords and reserved words begin here. */ %union{ /* this is the data union */ char name[128]; /* names */ } /*-------------------- the reserved words -----------------------------*/ %token PERIOD %token NEWLINE %token POSITIONAL %token VERB %token ADVERB %token PROPER_NOUN %token NOUN %token DECLARATIVE %token CONDITIONAL %type declarative %type verb_phrase %type noun_phrase %type position_phrase %type adverb %type POSITIONAL VERB ADVERB PROPER_NOUN %type NOUN DECLARATIVE CONDITIONAL %% sentence_list : sentence | sentence_list NEWLINE sentence ; sentence : verb_phrase noun_phrase position_phrase adverb period { printf("I understand that sentence.\n"); printf("VP = %s \n",$1); printf("NP = %s \n",$2); printf("PP = %s \n",$3); printf("AD = %s \n",$4); } | { yyerror("That's a strange sentence !!"); } ; position_phrase : POSITIONAL declarative PROPER_NOUN { sprintf($$,"%s %s %s",$1,$2,$3); } | /* empty */ { strcpy($$,""); } ; verb_phrase : VERB { strcpy($$,$1); strcat($$," "); } | adverb VERB { sprintf($$,"%s %s",$1,$2); } ; adverb : ADVERB { strcpy($$,$1); } | /* empty */ { strcpy($$,""); } ; noun_phrase : DECLARATIVE NOUN { sprintf($$,"%s %s",$1,$2); } | CONDITIONAL declarative NOUN { sprintf($$,"%s %s %s",$1,$2,$3); } | NOUN { strcpy($$,$1); strcat($$," "); } ; declarative : DECLARATIVE { strcpy($$,$1); } | /* empty */ { strcpy($$,""); } ; period : /* empty */ | PERIOD ; %% /* Supplied main() and yyerror() functions. */ int main(int argc, char *argv[]) { yyparse(); /* parse the file */ return(0); } int yyerror(char *message) { extern FILE *yyout; fprintf(yyout,"\nError at line %5d. (%s) \n", yylexlinenum,message); }