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 
yyerror(char * message)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