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