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 | }
|
---|