xref: /minix3/external/bsd/flex/dist/examples/manual/front.y (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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