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