1/* C code supplied at the beginning of the file. */ 2 3%{ 4 5#include <stdio.h> 6#include <string.h> 7 8extern int yylexlinenum; /* these are in YYlex */ 9extern 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 47sentence_list : sentence 48 | sentence_list NEWLINE sentence 49 ; 50 51 52sentence : 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 63position_phrase : POSITIONAL declarative PROPER_NOUN 64 { 65 sprintf($$,"%s %s %s",$1,$2,$3); 66 } 67 | /* empty */ { strcpy($$,""); } 68 ; 69 70 71verb_phrase : VERB { strcpy($$,$1); strcat($$," "); } 72 | adverb VERB 73 { 74 sprintf($$,"%s %s",$1,$2); 75 } 76 ; 77 78adverb : ADVERB { strcpy($$,$1); } 79 | /* empty */ { strcpy($$,""); } 80 ; 81 82noun_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 93declarative : DECLARATIVE { strcpy($$,$1); } 94 | /* empty */ { strcpy($$,""); } 95 ; 96 97period : /* empty */ 98 | PERIOD 99 ; 100 101 102%% 103 104/* Supplied main() and yyerror() functions. */ 105 106int main(int argc, char *argv[]) 107{ 108 yyparse(); /* parse the file */ 109 return(0); 110} 111 112int yyerror(char *message) 113{ 114 extern FILE *yyout; 115 116 fprintf(yyout,"\nError at line %5d. (%s) \n", 117 yylexlinenum,message); 118} 119