+++ /dev/null
-#ifndef sorcerer_h\r
-#define sorcerer_h\r
-\r
-/*\r
- * sorcerer.h -- header for all sorcerer files\r
- *\r
- * SOFTWARE RIGHTS\r
- *\r
- * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public\r
- * domain. An individual or company may do whatever they wish with\r
- * source code distributed with SORCERER or the code generated by\r
- * SORCERER, including the incorporation of SORCERER, or its output, into\r
- * commerical software.\r
- *\r
- * We encourage users to develop software with SORCERER. However, we do\r
- * ask that credit is given to us for developing SORCERER. By "credit",\r
- * we mean that if you incorporate our source code into one of your\r
- * programs (commercial product, research project, or otherwise) that you\r
- * acknowledge this fact somewhere in the documentation, research report,\r
- * etc... If you like SORCERER and have developed a nice tool with the\r
- * output, please mention that you developed it using SORCERER. In\r
- * addition, we ask that this header remain intact in our source code.\r
- * As long as these guidelines are kept, we expect to continue enhancing\r
- * this system and expect to make other tools available as they are\r
- * completed.\r
- *\r
- * SORCERER 1.00B\r
- * Terence Parr\r
- * AHPCRC, University of Minnesota\r
- * 1992-1994\r
- */\r
-\r
-#include "pcctscfg.h"\r
-\r
-#ifdef __USE_PROTOS\r
-#include <stdlib.h>\r
-#else\r
-#include <malloc.h>\r
-#endif\r
-\r
-#include <setjmp.h>\r
-\r
-/* SUPERCLASS SORAST (your tree must look at minimum like this)\r
-typedef struct _node {\r
- struct _node *right, *down;\r
- int token;\r
- -- user-defined stuff goes here\r
- } SORAST;\r
-*/\r
-\r
-/* Can be used sort of like inheritance to get the desired struct def */\r
-#define AST_REQD_FIELDS \\r
- struct _node *right, *down; \\r
- int token;\r
-\r
-/* C MATCH */ /* MR21 Short circuit on null pointer */\r
-#define _MATCH(tok) if (! _t || _t->token!=tok ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_token(_parser, tok, _t)\r
-#define _MATCHRANGE(tok,tok2) \\r
- if (! _t || _t->token<tok || _t->token>tok2 ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_range(_parser, tok, tok2, _t)\r
-\r
-/* C++ MATCH */\r
-#define _CPPMATCH(tok) if ( _t->token()!=tok ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_token(_parser, tok, _t)\r
-#define _CPPMATCHRANGE(tok,tok2) \\r
- if ( _t->token()<tok || _t->token()>tok2 ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_range(_parser, tok, tok2, _t)\r
-\r
-/* Normal DOWN and RIGHT */\r
-#define _DOWN _t=_t->down\r
-#define _RIGHT _t=_t->right\r
-\r
-/* C++ DOWN and RIGHT */\r
-#define _CPPDOWN _t=(SORAST *) _t->down()\r
-#define _CPPRIGHT _t=(SORAST *) _t->right()\r
-\r
-#define _SAVE SORAST *_save=_t\r
-#define _RESTORE _t = _save\r
-#define _SETLABEL(u) u=_t\r
-#define _WILDCARD if ( _t==NULL ) if ( _parser->guessing ) _GUESS_FAIL; else missing_wildcard(_parser)\r
-#define _GUESS_BLOCK STreeParser _st; int _gv; SORAST *_savet=NULL;\r
-#define _GUESS {_st = *_parser; \\r
- _savet = _t; \\r
- _parser->guessing = 1; \\r
- _gv = setjmp(_parser->startofguess.state);}\r
-#define _GUESS_FAIL longjmp(_parser->startofguess.state, 1)\r
-#define _GUESS_DONE {*_parser = _st; _t = _savet;}\r
-\r
-/* These are used mainly by the C output */\r
-#ifndef ast_down\r
-#define ast_down down\r
-#endif\r
-#ifndef ast_right\r
-#define ast_right right\r
-#endif\r
-\r
-#define STreeTry(r,p,t) \\r
- (p)->try_result = NULL; \\r
- (p)->sjrv = setjmp((p)->startofguess); \\r
- if ( !(p)->sjrv ) { \\r
- rule(p,t,&try_result); \\r
- (p)->try_ok = 1; \\r
- } \\r
- else { \\r
- (p)->try_ok = 0; \\r
- } \\r
- if ( (p)->try_ok )\r
-\r
-\r
-/* Used only during TRANSFORM mode */\r
-#define TREE_CONSTR_PTRS SORAST *_r=NULL,*_s=NULL,*_e=NULL\r
-\r
-typedef struct _Sjmp_buf {\r
- jmp_buf state;\r
- } Sjmp_buf;\r
-\r
-#ifndef _PARSER_VARS\r
-#define _PARSER_VARS\r
-#endif\r
-\r
-#ifndef _REFVARS\r
-#define _REFVARS\r
-#endif\r
-\r
-typedef struct _STreeParser {\r
- int try_ok, sjrv; /* used by STreeTry macro */\r
- SORAST *try_result; /* tree coming back from try */\r
- int guessing;\r
- Sjmp_buf startofguess;\r
- SORAST *t;\r
- _REFVARS\r
- _PARSER_VARS\r
- } STreeParser;\r
-\r
-#define STreeParserInit(_p) { (_p)->guessing = 0; _refvar_inits(_p); }\r
-\r
-\r
- /* S a n i t y C h e c k i n g */\r
-\r
-#ifndef require\r
-#define require(expr, err) {if ( !(expr) ) sorcerer_panic(err);}\r
-#endif\r
-\r
-\r
- /* T r a n s f o r m M a c r o s */\r
-#define ast_return(_t) *_result = _t\r
-\r
-\r
-#ifdef __USE_PROTOS\r
-extern void mismatched_range(STreeParser *_parser, int looking_for, int upper_token, SORAST *found);\r
-extern void missing_wildcard(STreeParser *_parser);\r
-extern void mismatched_token(STreeParser *_parser, int looking_for, SORAST *found);\r
-extern void no_viable_alt(STreeParser *_parser, char *rulename, SORAST *root);\r
-extern void sorcerer_panic(char *err);\r
-extern void _refvar_inits(STreeParser *); /* MR15 Kevin J. Cummings */\r
-extern void _mkroot(SORAST **, SORAST **, SORAST **, SORAST *);\r
-extern void _mkchild(SORAST **, SORAST **, SORAST **, SORAST *);\r
-extern SORAST *ast_alloc(void);\r
-extern SORAST *ast_dup(SORAST *t);\r
-extern SORAST *ast_dup_node(SORAST *t);\r
-#else\r
-extern void mismatched_range();\r
-extern void missing_wildcard();\r
-extern void mismatched_token();\r
-extern void no_viable_alt();\r
-extern void sorcerer_panic();\r
-extern void _refvar_inits(); /* MR15 Kevin J. Cummings */\r
-extern void _mkroot();\r
-extern void _mkchild();\r
-extern SORAST *ast_alloc();\r
-extern SORAST *ast_dup();\r
-extern SORAST *ast_dup_node();\r
-#endif\r
-\r
-#endif\r