1 /* C code supplied at the beginning of the file. */ 2 3 %{ 4 5 #include <stdio.h> 6 #include <string.h> 7 8 extern int yylexlinenum; /* these are in YYlex */ 9 extern char *yytext; /* current token */ 10 11 12 %} 13 14 /* Keywords and reserved words begin here. */ 15 16 %union{ /* this is the data union */ 17 char name[128]; /* names */ 18 } 19 20 /*-------------------- the reserved words -----------------------------*/ 21 22 %token PERIOD 23 %token NEWLINE 24 %token POSITIONAL 25 26 %token VERB 27 %token ADVERB 28 29 %token PROPER_NOUN 30 %token NOUN 31 32 %token DECLARATIVE 33 %token CONDITIONAL 34 35 36 %type <name> declarative 37 %type <name> verb_phrase 38 %type <name> noun_phrase 39 %type <name> position_phrase 40 %type <name> adverb 41 42 %type <name> POSITIONAL VERB ADVERB PROPER_NOUN 43 %type <name> NOUN DECLARATIVE CONDITIONAL 44 45 %% 46 47 sentence_list : sentence 48 | sentence_list NEWLINE sentence 49 ; 50 51 52 sentence : verb_phrase noun_phrase position_phrase adverb period 53 { 54 printf("I understand that sentence.\n"); 55 printf("VP = %s \n",$1); 56 printf("NP = %s \n",$2); 57 printf("PP = %s \n",$3); 58 printf("AD = %s \n",$4); 59 } 60 | { yyerror("That's a strange sentence !!"); } 61 ; 62 63 position_phrase : POSITIONAL declarative PROPER_NOUN 64 { 65 sprintf($$,"%s %s %s",$1,$2,$3); 66 } 67 | /* empty */ { strcpy($$,""); } 68 ; 69 70 71 verb_phrase : VERB { strcpy($$,$1); strcat($$," "); } 72 | adverb VERB 73 { 74 sprintf($$,"%s %s",$1,$2); 75 } 76 ; 77 78 adverb : ADVERB { strcpy($$,$1); } 79 | /* empty */ { strcpy($$,""); } 80 ; 81 82 noun_phrase : DECLARATIVE NOUN 83 { 84 sprintf($$,"%s %s",$1,$2); 85 } 86 | CONDITIONAL declarative NOUN 87 { 88 sprintf($$,"%s %s %s",$1,$2,$3); 89 } 90 | NOUN { strcpy($$,$1); strcat($$," "); } 91 ; 92 93 declarative : DECLARATIVE { strcpy($$,$1); } 94 | /* empty */ { strcpy($$,""); } 95 ; 96 97 period : /* empty */ 98 | PERIOD 99 ; 100 101 102 %% 103 104 /* Supplied main() and yyerror() functions. */ 105 106 int main(int argc, char *argv[]) 107 { 108 yyparse(); /* parse the file */ 109 return(0); 110 } 111 112 int yyerror(char *message) 113 { 114 extern FILE *yyout; 115 116 fprintf(yyout,"\nError at line %5d. (%s) \n", 117 yylexlinenum,message); 118 } 119