source: trunk/third/enscript/states/gram.y @ 17620

Revision 17620, 6.3 KB checked in by ghudson, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r17619, which included commits to RCS files with non-trunk default branches.
Line 
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
67file    : /* empty */
68        | file toplevel
69        ;
70
71toplevel : 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
81regexp_sym_list : /* empty */           { $$ = list (); }
82        | regexp_sym_list tREGEXP tSYMBOL ';'
83                                        { list_append ($1, cons ($2, $3)); }
84        ;
85
86staterules : /* empty */                { $$ = list (); }
87        | staterules staterule          { list_append ($1, $2); }
88
89staterule : 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
95symbol_list : /* empty */               { $$ = list (); }
96        | rest_symbol_list              { $$ = $1; }
97        ;
98
99rest_symbol_list : tSYMBOL              { $$ = list (); list_append ($$, $1); }
100        | rest_symbol_list ',' tSYMBOL  { list_append ($1, $3); }
101        ;
102
103locals  : /* empty */                   { $$ = list (); }
104        | tLOCAL locals_rest ';'        { $$ = $2; }
105        ;
106
107locals_rest : local_def                 { $$ = list (); list_append ($$, $1); }
108        | locals_rest ',' local_def     { list_append ($1, $3); }
109        ;
110
111local_def : tSYMBOL                     { $$ = cons ($1, NULL); }
112        | tSYMBOL '=' expr              { $$ = cons ($1, $3); }
113        ;
114
115stmt_list : /* empty */                 { $$ = list (); }
116        | stmt_list stmt                { list_append ($1, $2); }
117        ;
118
119stmt    : 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
144expr    : 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
198cond_expr : /* empty */                 { $$ = NULL; }
199        | expr                          { $$ = $1; }
200        ;
201
202expr_list : /* empty */                 { $$ = list (); }
203        | rest_expr_list                { $$ = $1; }
204        ;
205
206rest_expr_list: expr                    { $$ = list (); list_append ($$, $1); }
207        | rest_expr_list ',' expr       { list_append ($1, $3); }
208        ;
209
210%%
211
212void
213yyerror (msg)
214     char *msg;
215{
216  fprintf (stderr, "%s:%d: %s\n", defs_file, linenum, msg);
217}
Note: See TracBrowser for help on using the repository browser.