1 | %{ |
---|
2 | /* -*- c -*- |
---|
3 | * Grammar for states. |
---|
4 | * Copyright (c) 1997 Markku Rossi. |
---|
5 | * |
---|
6 | * Author: Markku Rossi <mtr@iki.fi> |
---|
7 | */ |
---|
8 | |
---|
9 | /* |
---|
10 | * This file is part of GNU enscript. |
---|
11 | * |
---|
12 | * This program is free software; you can redistribute it and/or modify |
---|
13 | * it under the terms of the GNU General Public License as published by |
---|
14 | * the Free Software Foundation; either version 2, or (at your option) |
---|
15 | * any later version. |
---|
16 | * |
---|
17 | * This program is distributed in the hope that it will be useful, |
---|
18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
20 | * GNU General Public License for more details. |
---|
21 | * |
---|
22 | * You should have received a copy of the GNU General Public License |
---|
23 | * along with this program; see the file COPYING. If not, write to |
---|
24 | * the Free Software Foundation, 59 Temple Place - Suite 330, |
---|
25 | * Boston, MA 02111-1307, USA. |
---|
26 | */ |
---|
27 | |
---|
28 | /* |
---|
29 | * $Id: gram.y,v 1.1.1.1 2002-05-29 18:20:37 ghudson Exp $ |
---|
30 | */ |
---|
31 | |
---|
32 | #include "defs.h" |
---|
33 | %} |
---|
34 | |
---|
35 | %union |
---|
36 | { |
---|
37 | List *lst; |
---|
38 | Node *node; |
---|
39 | Cons *cons; |
---|
40 | Stmt *stmt; |
---|
41 | Expr *expr; |
---|
42 | } |
---|
43 | |
---|
44 | %token <node> tSYMBOL tREGEXP tSTRING tINTEGER tREAL |
---|
45 | %token tSUB tSTATE tSTART tSTARTRULES tNAMERULES tBEGIN tEND tRETURN tIF tELSE |
---|
46 | %token tLOCAL tWHILE tFOR |
---|
47 | |
---|
48 | %right '=' tADDASSIGN tSUBASSIGN tMULASSIGN tDIVASSIGN |
---|
49 | %right '?' ':' |
---|
50 | %left tOR |
---|
51 | %left tAND |
---|
52 | %left tEQ tNE |
---|
53 | %left '<' '>' tGE tLE |
---|
54 | %left '+' '-' |
---|
55 | %left '*' tDIV |
---|
56 | %right '!' tPLUSPLUS tMINUSMINUS |
---|
57 | %left '[' ']' |
---|
58 | |
---|
59 | %type <lst> regexp_sym_list symbol_list rest_symbol_list staterules |
---|
60 | %type <lst> stmt_list expr_list rest_expr_list locals locals_rest |
---|
61 | %type <stmt> stmt |
---|
62 | %type <expr> expr cond_expr |
---|
63 | %type <cons> staterule local_def |
---|
64 | |
---|
65 | %% |
---|
66 | |
---|
67 | file : /* empty */ |
---|
68 | | file toplevel |
---|
69 | ; |
---|
70 | |
---|
71 | toplevel : tSTART '{' stmt_list '}' { start_stmts = $3; } |
---|
72 | | tSTARTRULES '{' regexp_sym_list '}' |
---|
73 | { startrules = $3; } |
---|
74 | | tNAMERULES '{' regexp_sym_list '}' |
---|
75 | { namerules = $3; } |
---|
76 | | tSTATE tSYMBOL '{' staterules '}' |
---|
77 | { define_state ($2, $4); } |
---|
78 | | stmt { list_append (global_stmts, $1); } |
---|
79 | ; |
---|
80 | |
---|
81 | regexp_sym_list : /* empty */ { $$ = list (); } |
---|
82 | | regexp_sym_list tREGEXP tSYMBOL ';' |
---|
83 | { list_append ($1, cons ($2, $3)); } |
---|
84 | ; |
---|
85 | |
---|
86 | staterules : /* empty */ { $$ = list (); } |
---|
87 | | staterules staterule { list_append ($1, $2); } |
---|
88 | |
---|
89 | staterule : tBEGIN '{' stmt_list '}' { $$ = cons (RULE_BEGIN, $3); } |
---|
90 | | tEND '{' stmt_list '}' { $$ = cons (RULE_END, $3); } |
---|
91 | | tREGEXP '{' stmt_list '}' { $$ = cons ($1, $3); } |
---|
92 | | tSYMBOL '{' stmt_list '}' { $$ = cons ($1, $3); } |
---|
93 | ; |
---|
94 | |
---|
95 | symbol_list : /* empty */ { $$ = list (); } |
---|
96 | | rest_symbol_list { $$ = $1; } |
---|
97 | ; |
---|
98 | |
---|
99 | rest_symbol_list : tSYMBOL { $$ = list (); list_append ($$, $1); } |
---|
100 | | rest_symbol_list ',' tSYMBOL { list_append ($1, $3); } |
---|
101 | ; |
---|
102 | |
---|
103 | locals : /* empty */ { $$ = list (); } |
---|
104 | | tLOCAL locals_rest ';' { $$ = $2; } |
---|
105 | ; |
---|
106 | |
---|
107 | locals_rest : local_def { $$ = list (); list_append ($$, $1); } |
---|
108 | | locals_rest ',' local_def { list_append ($1, $3); } |
---|
109 | ; |
---|
110 | |
---|
111 | local_def : tSYMBOL { $$ = cons ($1, NULL); } |
---|
112 | | tSYMBOL '=' expr { $$ = cons ($1, $3); } |
---|
113 | ; |
---|
114 | |
---|
115 | stmt_list : /* empty */ { $$ = list (); } |
---|
116 | | stmt_list stmt { list_append ($1, $2); } |
---|
117 | ; |
---|
118 | |
---|
119 | stmt : tRETURN ';' { $$ = mk_stmt (sRETURN, NULL, NULL, |
---|
120 | NULL, NULL); } |
---|
121 | | tRETURN expr ';' { $$ = mk_stmt (sRETURN, $2, NULL, |
---|
122 | NULL, NULL); } |
---|
123 | | tSUB tSYMBOL '(' symbol_list ')' '{' locals stmt_list '}' |
---|
124 | { $$ = mk_stmt (sDEFSUB, $2, |
---|
125 | cons (cons ($4, $7), |
---|
126 | $8), |
---|
127 | NULL, NULL); } |
---|
128 | | '{' stmt_list '}' { $$ = mk_stmt (sBLOCK, $2, NULL, |
---|
129 | NULL, NULL); } |
---|
130 | | tIF '(' expr ')' stmt { $$ = mk_stmt (sIF, $3, $5, NULL, |
---|
131 | NULL); } |
---|
132 | | tIF '(' expr ')' stmt tELSE stmt |
---|
133 | { $$ = mk_stmt (sIF, $3, $5, $7, |
---|
134 | NULL); } |
---|
135 | | tWHILE '(' expr ')' stmt { $$ = mk_stmt (sWHILE, $3, $5, |
---|
136 | NULL, NULL); } |
---|
137 | | tFOR '(' cond_expr ';' expr ';' cond_expr ')' stmt |
---|
138 | { $$ = mk_stmt (sFOR, $3, $5, $7, |
---|
139 | $9); } |
---|
140 | | expr ';' { $$ = mk_stmt (sEXPR, $1, NULL, |
---|
141 | NULL, NULL); } |
---|
142 | ; |
---|
143 | |
---|
144 | expr : tSTRING { $$ = mk_expr (eSTRING, $1, NULL, |
---|
145 | NULL); } |
---|
146 | | tREGEXP { $$ = mk_expr (eREGEXP, $1, NULL, |
---|
147 | NULL); } |
---|
148 | | tINTEGER { $$ = mk_expr (eINTEGER, $1, NULL, |
---|
149 | NULL); } |
---|
150 | | tREAL { $$ = mk_expr (eREAL, $1, NULL, |
---|
151 | NULL); } |
---|
152 | | tSYMBOL { $$ = mk_expr (eSYMBOL, $1, NULL, |
---|
153 | NULL); } |
---|
154 | | '!' expr { $$ = mk_expr (eNOT, $2, NULL, |
---|
155 | NULL); } |
---|
156 | | expr tAND expr { $$ = mk_expr (eAND, $1, $3, NULL); } |
---|
157 | | expr tOR expr { $$ = mk_expr (eOR, $1, $3, NULL); } |
---|
158 | | tSYMBOL '(' expr_list ')' { $$ = mk_expr (eFCALL, $1, $3, |
---|
159 | NULL); } |
---|
160 | | tSYMBOL '=' expr { $$ = mk_expr (eASSIGN, $1, $3, |
---|
161 | NULL); } |
---|
162 | | tSYMBOL tADDASSIGN expr { $$ = mk_expr (eADDASSIGN, $1, $3, |
---|
163 | NULL); } |
---|
164 | | tSYMBOL tSUBASSIGN expr { $$ = mk_expr (eSUBASSIGN, $1, $3, |
---|
165 | NULL); } |
---|
166 | | tSYMBOL tMULASSIGN expr { $$ = mk_expr (eMULASSIGN, $1, $3, |
---|
167 | NULL); } |
---|
168 | | tSYMBOL tDIVASSIGN expr { $$ = mk_expr (eDIVASSIGN, $1, $3, |
---|
169 | NULL); } |
---|
170 | | tSYMBOL tPLUSPLUS { $$ = mk_expr (ePOSTFIXADD, $1, NULL, |
---|
171 | NULL); } |
---|
172 | | tSYMBOL tMINUSMINUS { $$ = mk_expr (ePOSTFIXSUB, $1, NULL, |
---|
173 | NULL); } |
---|
174 | | tPLUSPLUS tSYMBOL { $$ = mk_expr (ePREFIXADD, $2, NULL, |
---|
175 | NULL); } |
---|
176 | | tMINUSMINUS tSYMBOL { $$ = mk_expr (ePREFIXSUB, $2, NULL, |
---|
177 | NULL); } |
---|
178 | | expr '[' expr ']' '=' expr { $$ = mk_expr (eARRAYASSIGN, $1, $3, |
---|
179 | $6); } |
---|
180 | | '(' expr ')' { $$ = $2; } |
---|
181 | | expr '[' expr ']' { $$ = mk_expr (eARRAYREF, $1, $3, |
---|
182 | NULL); } |
---|
183 | | expr '?' expr ':' expr { $$ = mk_expr (eQUESTCOLON, $1, $3, |
---|
184 | $5); } |
---|
185 | | expr '*' expr { $$ = mk_expr (eMULT, $1, $3, NULL); } |
---|
186 | | expr tDIV expr { $$ = mk_expr (eDIV, $1, $3, NULL); } |
---|
187 | | expr '+' expr { $$ = mk_expr (ePLUS, $1, $3, NULL); } |
---|
188 | | expr '-' expr { $$ = mk_expr (eMINUS, $1, $3, |
---|
189 | NULL); } |
---|
190 | | expr '<' expr { $$ = mk_expr (eLT, $1, $3, NULL); } |
---|
191 | | expr '>' expr { $$ = mk_expr (eGT, $1, $3, NULL); } |
---|
192 | | expr tEQ expr { $$ = mk_expr (eEQ, $1, $3, NULL); } |
---|
193 | | expr tNE expr { $$ = mk_expr (eNE, $1, $3, NULL); } |
---|
194 | | expr tGE expr { $$ = mk_expr (eGE, $1, $3, NULL); } |
---|
195 | | expr tLE expr { $$ = mk_expr (eLE, $1, $3, NULL); } |
---|
196 | ; |
---|
197 | |
---|
198 | cond_expr : /* empty */ { $$ = NULL; } |
---|
199 | | expr { $$ = $1; } |
---|
200 | ; |
---|
201 | |
---|
202 | expr_list : /* empty */ { $$ = list (); } |
---|
203 | | rest_expr_list { $$ = $1; } |
---|
204 | ; |
---|
205 | |
---|
206 | rest_expr_list: expr { $$ = list (); list_append ($$, $1); } |
---|
207 | | rest_expr_list ',' expr { list_append ($1, $3); } |
---|
208 | ; |
---|
209 | |
---|
210 | %% |
---|
211 | |
---|
212 | void |
---|
213 | yyerror (msg) |
---|
214 | char *msg; |
---|
215 | { |
---|
216 | fprintf (stderr, "%s:%d: %s\n", defs_file, linenum, msg); |
---|
217 | } |
---|