[go: up one dir, main page]

File: sorcerer.h

package info (click to toggle)
sorcerer 1.0
  • links: PTS
  • area: main
  • in suites: slink
  • size: 736 kB
  • ctags: 1,524
  • sloc: ansic: 11,308; cpp: 1,388; makefile: 300
file content (179 lines) | stat: -rw-r--r-- 5,440 bytes parent folder | download
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
173
174
175
176
177
178
179
#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
 */

#ifdef __STDC__
#define __USE_PROTOS
#endif
#ifdef __cplusplus
#ifndef __USE_PROTOS
#define __USE_PROTOS
#endif
#endif

#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 */
#define _MATCH(tok)	if ( _t->token!=tok ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_token(_parser, tok, _t)
#define _MATCHRANGE(tok,tok2) \
		if ( _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 _refvars_inits(STreeParser *);
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 _refvars_inits();
extern void _mkroot();
extern void _mkchild();
extern SORAST *ast_alloc();
extern SORAST *ast_dup();
extern SORAST *ast_dup_node();
#endif

#endif