1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
#ifndef sorcerer_h
#define sorcerer_h
/*
* sorcerer.h -- header for all sorcerer files
*
* SOFTWARE RIGHTS
*
* We reserve no LEGAL rights to SORCERER -- SORCERER is in the public
* domain. An individual or company may do whatever they wish with
* source code distributed with SORCERER or the code generated by
* SORCERER, including the incorporation of SORCERER, or its output, into
* commerical software.
*
* We encourage users to develop software with SORCERER. However, we do
* ask that credit is given to us for developing SORCERER. By "credit",
* we mean that if you incorporate our source code into one of your
* programs (commercial product, research project, or otherwise) that you
* acknowledge this fact somewhere in the documentation, research report,
* etc... If you like SORCERER and have developed a nice tool with the
* output, please mention that you developed it using SORCERER. In
* addition, we ask that this header remain intact in our source code.
* As long as these guidelines are kept, we expect to continue enhancing
* this system and expect to make other tools available as they are
* completed.
*
* SORCERER 1.00B
* Terence Parr
* AHPCRC, University of Minnesota
* 1992-1994
*/
#include "pcctscfg.h"
#ifdef __USE_PROTOS
#include <stdlib.h>
#else
#include <malloc.h>
#endif
#include <setjmp.h>
/* SUPERCLASS SORAST (your tree must look at minimum like this)
typedef struct _node {
struct _node *right, *down;
int token;
-- user-defined stuff goes here
} SORAST;
*/
/* Can be used sort of like inheritance to get the desired struct def */
#define AST_REQD_FIELDS \
struct _node *right, *down; \
int token;
/* C MATCH */ /* MR21 Short circuit on null pointer */
#define _MATCH(tok) if (! _t || _t->token!=tok ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_token(_parser, tok, _t)
#define _MATCHRANGE(tok,tok2) \
if (! _t || _t->token<tok || _t->token>tok2 ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_range(_parser, tok, tok2, _t)
/* C++ MATCH */
#define _CPPMATCH(tok) if ( _t->token()!=tok ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_token(_parser, tok, _t)
#define _CPPMATCHRANGE(tok,tok2) \
if ( _t->token()<tok || _t->token()>tok2 ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_range(_parser, tok, tok2, _t)
/* Normal DOWN and RIGHT */
#define _DOWN _t=_t->down
#define _RIGHT _t=_t->right
/* C++ DOWN and RIGHT */
#define _CPPDOWN _t=(SORAST *) _t->down()
#define _CPPRIGHT _t=(SORAST *) _t->right()
#define _SAVE SORAST *_save=_t
#define _RESTORE _t = _save
#define _SETLABEL(u) u=_t
#define _WILDCARD if ( _t==NULL ) if ( _parser->guessing ) _GUESS_FAIL; else missing_wildcard(_parser)
#define _GUESS_BLOCK STreeParser _st; int _gv; SORAST *_savet=NULL;
#define _GUESS {_st = *_parser; \
_savet = _t; \
_parser->guessing = 1; \
_gv = setjmp(_parser->startofguess.state);}
#define _GUESS_FAIL longjmp(_parser->startofguess.state, 1)
#define _GUESS_DONE {*_parser = _st; _t = _savet;}
/* These are used mainly by the C output */
#ifndef ast_down
#define ast_down down
#endif
#ifndef ast_right
#define ast_right right
#endif
#define STreeTry(r,p,t) \
(p)->try_result = NULL; \
(p)->sjrv = setjmp((p)->startofguess); \
if ( !(p)->sjrv ) { \
rule(p,t,&try_result); \
(p)->try_ok = 1; \
} \
else { \
(p)->try_ok = 0; \
} \
if ( (p)->try_ok )
/* Used only during TRANSFORM mode */
#define TREE_CONSTR_PTRS SORAST *_r=NULL,*_s=NULL,*_e=NULL
typedef struct _Sjmp_buf {
jmp_buf state;
} Sjmp_buf;
#ifndef _PARSER_VARS
#define _PARSER_VARS
#endif
#ifndef _REFVARS
#define _REFVARS
#endif
typedef struct _STreeParser {
int try_ok, sjrv; /* used by STreeTry macro */
SORAST *try_result; /* tree coming back from try */
int guessing;
Sjmp_buf startofguess;
SORAST *t;
_REFVARS
_PARSER_VARS
} STreeParser;
#define STreeParserInit(_p) { (_p)->guessing = 0; _refvar_inits(_p); }
/* S a n i t y C h e c k i n g */
#ifndef require
#define require(expr, err) {if ( !(expr) ) sorcerer_panic(err);}
#endif
/* T r a n s f o r m M a c r o s */
#define ast_return(_t) *_result = _t
#ifdef __USE_PROTOS
extern void mismatched_range(STreeParser *_parser, int looking_for, int upper_token, SORAST *found);
extern void missing_wildcard(STreeParser *_parser);
extern void mismatched_token(STreeParser *_parser, int looking_for, SORAST *found);
extern void no_viable_alt(STreeParser *_parser, char *rulename, SORAST *root);
extern void sorcerer_panic(char *err);
extern void _refvar_inits(STreeParser *); /* MR15 Kevin J. Cummings */
extern void _mkroot(SORAST **, SORAST **, SORAST **, SORAST *);
extern void _mkchild(SORAST **, SORAST **, SORAST **, SORAST *);
extern SORAST *ast_alloc(void);
extern SORAST *ast_dup(SORAST *t);
extern SORAST *ast_dup_node(SORAST *t);
#else
extern void mismatched_range();
extern void missing_wildcard();
extern void mismatched_token();
extern void no_viable_alt();
extern void sorcerer_panic();
extern void _refvar_inits(); /* MR15 Kevin J. Cummings */
extern void _mkroot();
extern void _mkchild();
extern SORAST *ast_alloc();
extern SORAST *ast_dup();
extern SORAST *ast_dup_node();
#endif
#endif
|