1 /* Abstract syntax tree
2  *
3  * SOFTWARE RIGHTS
4  *
5  * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
6  * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
7  * company may do whatever they wish with source code distributed with
8  * PCCTS or the code generated by PCCTS, including the incorporation of
9  * PCCTS, or its output, into commerical software.
10  *
11  * We encourage users to develop software with PCCTS.  However, we do ask
12  * that credit is given to us for developing PCCTS.  By "credit",
13  * we mean that if you incorporate our source code into one of your
14  * programs (commercial product, research project, or otherwise) that you
15  * acknowledge this fact somewhere in the documentation, research report,
16  * etc...  If you like PCCTS and have developed a nice tool with the
17  * output, please mention that you developed it using PCCTS.  In
18  * addition, we ask that this header remain intact in our source code.
19  * As long as these guidelines are kept, we expect to continue enhancing
20  * this system and expect to make other tools available as they are
21  * completed.
22  *
23  * ANTLR 1.33
24  * Terence Parr
25  * Parr Research Corporation
26  * with Purdue University and AHPCRC, University of Minnesota
27  * 1989-2000
28  */
29 
30 #ifndef PCCTSAST_H
31 #define PCCTSAST_H
32 
33 #include "pcctscfg.h"
34 
35 #include "pccts_stdio.h"
36 #include "pccts_stdlib.h"
37 
38 PCCTS_NAMESPACE_STD
39 
40 //class SList;
41 
42 #define StringScanMaxText	50
43 #define MaxTreeStackDepth	400
44 
45 //
46 //  7-Apr-97 133MR1	signed int not accepted by AT&T cfront
47 //
48 typedef struct stringlexer {
49 			int c;						// MR1
50 			char *input;
51 			char *p;
52 			char text[StringScanMaxText];
53 		} StringLexer;
54 
55 /* Define the structures needed for ast_scan() */
56 typedef struct stringparser {
57 			int token;
58 			StringLexer *lexer;
59 			int num_labels;
60 		} StringParser;
61 
62 typedef struct _scanast {
63             struct _scanast *_right, *_down;
64             int _token;
65 			int label_num;
type_scanast66 			int type() { return _token; }
right_scanast67 			struct _scanast *right() { return _right; }
down_scanast68 			struct _scanast *down() { return _down; }
69         } ScanAST;
70 
71 #define VALID_SCAN_TOKEN(t)		(t>=__LPAREN && t<=__PERIOD)
72 
73 class DllExportPCCTS PCCTS_AST {
74 protected:
75 	static const char *scan_token_tbl[];    /* MR20 const */
76 	enum {
77 	__LPAREN=1,
78 	__RPAREN=2,
79 	__PERCENT=3,
80 	__INT=4,
81 	__COLON=5,
82 	__POUND=6,
83 	__PERIOD=7,
84 	__StringScanEOF=-1};
85 
86 protected:
87 	const char *scan_token_str(int t);  /* MR20 const */
88 	void stringlexer_init(StringLexer *scanner, char *input);
89 	void stringparser_init(StringParser *, StringLexer *);
90 	ScanAST *stringparser_parse_scanast(char *templ, int *n);
91 	ScanAST *stringparser_parse_tree(StringParser *parser);
92 	ScanAST *stringparser_parse_element(StringParser *parser);
93 	void stringscan_advance(StringLexer *scanner);
94 	int stringscan_gettok(StringLexer *scanner);
95 	void _push(PCCTS_AST **st, int *sp, PCCTS_AST *e);
96 	PCCTS_AST *_pop(PCCTS_AST **st, int *sp);
97 	int match_partial(PCCTS_AST *t, PCCTS_AST *u);
98 	int scanmatch(ScanAST *t, PCCTS_AST **labels[], int *n);
99 	void scanast_free(ScanAST *t);
100 	ScanAST *new_scanast(int tok);
101 	void stringparser_match(StringParser *parser, int type);
102 	virtual PCCTS_AST *deepCopyBushy();
103 
104 public:
PCCTS_AST()105 	PCCTS_AST()	{;}
~PCCTS_AST()106 	virtual ~PCCTS_AST() {;}
107 
108 	/* This group must be defined for SORCERER to work correctly */
109 	virtual PCCTS_AST *right() = 0;
110 	virtual PCCTS_AST *down() = 0;
111 	virtual void setRight(PCCTS_AST *t) = 0;
112 	virtual void setDown(PCCTS_AST *t) = 0;
113 // we define these so ANTLR doesn't have to
type()114 	virtual int type() { return 0; }
setType(int)115 	virtual void setType(int /*t MR23 */) {;}
shallowCopy()116 	virtual PCCTS_AST *shallowCopy() {panic("no shallowCopy() defined"); return NULL;}
117 
118 	/* These are not needed by ANTLR, but are support functions */
119 	virtual PCCTS_AST *deepCopy();	// used by SORCERER in transform mode
120 	virtual void addChild(PCCTS_AST *t);
lisp_action(FILE *)121 	virtual void lisp_action(FILE * /*f MR23 */) {;}
122 	virtual void lisp(FILE *f);
123 	static PCCTS_AST *make(PCCTS_AST *rt, ...);
124 	virtual PCCTS_AST *ast_find_all(PCCTS_AST *u, PCCTS_AST **cursor);
125 	virtual int match(PCCTS_AST *u);
126 	virtual void insert_after(PCCTS_AST *b);
127 	virtual void append(PCCTS_AST *b);
128 	virtual PCCTS_AST *tail();
129 	virtual PCCTS_AST *bottom();
130 	static  PCCTS_AST *cut_between(PCCTS_AST *a, PCCTS_AST *b);
131 //	virtual SList *to_slist();
132 	virtual void tfree();
133 	int ast_scan(char *templ, ...);
134 	virtual int nsiblings();
135 	virtual PCCTS_AST *sibling_index(int i);
136 
require(int e,const char * err)137 	void require(int e,const char *err){ if ( !e ) panic(err); } /* MR20 const */
panic(const char * err)138 	virtual void panic(const char *err)     // MR20 const
139 		{ /* MR23 */ printMessage(stderr, "PCCTS_AST: %s\n", err); exit(PCCTS_EXIT_FAILURE); }
140 	virtual int printMessage(FILE* pFile, const char* pFormat, ...); // MR23
141 };
142 
143 #endif /* PCCTSAST_H */
144