]> pd.if.org Git - pccts/blobdiff - h/PCCTSAST.h
auto commit for import
[pccts] / h / PCCTSAST.h
diff --git a/h/PCCTSAST.h b/h/PCCTSAST.h
new file mode 100755 (executable)
index 0000000..ba4e799
--- /dev/null
@@ -0,0 +1,135 @@
+/* Abstract syntax tree
+ *
+ * SOFTWARE RIGHTS
+ *
+ * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
+ * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
+ * company may do whatever they wish with source code distributed with
+ * PCCTS or the code generated by PCCTS, including the incorporation of
+ * PCCTS, or its output, into commerical software.
+ * 
+ * We encourage users to develop software with PCCTS.  However, we do ask
+ * that credit is given to us for developing PCCTS.  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 PCCTS and have developed a nice tool with the
+ * output, please mention that you developed it using PCCTS.  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.
+ *
+ * ANTLR 1.33
+ * Terence Parr
+ * Parr Research Corporation
+ * with Purdue University and AHPCRC, University of Minnesota
+ * 1989-1995
+ */
+
+#ifndef PCCTSAST_H
+#define PCCTSAST_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "config.h"
+//class SList;
+
+#define StringScanMaxText      50
+#define MaxTreeStackDepth      400
+
+typedef struct stringlexer {
+                       signed int c;
+                       char *input;
+                       char *p;
+                       char text[StringScanMaxText];
+               } StringLexer;
+
+/* Define the structures needed for ast_scan() */
+typedef struct stringparser {
+                       int token;
+                       StringLexer *lexer;
+                       int num_labels;
+               } StringParser;
+
+typedef struct _scanast {
+            struct _scanast *_right, *_down;
+            int _token;
+                       int label_num;
+                       int type() { return _token; }
+                       struct _scanast *right() { return _right; }
+                       struct _scanast *down() { return _down; }
+        } ScanAST;
+
+#define VALID_SCAN_TOKEN(t)            (t>=__LPAREN && t<=__PERIOD)
+
+class PCCTS_AST {
+protected:
+       static char *scan_token_tbl[];
+       enum {
+       __LPAREN=1,
+       __RPAREN=2,
+       __PERCENT=3,
+       __INT=4,
+       __COLON=5,
+       __POUND=6,
+       __PERIOD=7,
+       __StringScanEOF=-1};
+
+protected:
+       char *scan_token_str(int t);
+       void stringlexer_init(StringLexer *scanner, char *input);
+       void stringparser_init(StringParser *, StringLexer *);
+       ScanAST *stringparser_parse_scanast(char *templ, int *n);
+       ScanAST *stringparser_parse_tree(StringParser *parser);
+       ScanAST *stringparser_parse_element(StringParser *parser);
+       void stringscan_advance(StringLexer *scanner);
+       int stringscan_gettok(StringLexer *scanner);
+       void _push(PCCTS_AST **st, int *sp, PCCTS_AST *e);
+       PCCTS_AST *_pop(PCCTS_AST **st, int *sp);
+       int match_partial(PCCTS_AST *t, PCCTS_AST *u);
+       int scanmatch(ScanAST *t, PCCTS_AST **labels[], int *n);
+       void scanast_free(ScanAST *t);
+       ScanAST *new_scanast(int tok);
+       void stringparser_match(StringParser *parser, int type);
+       virtual PCCTS_AST *deepCopyBushy();
+
+public:
+       PCCTS_AST()     {;}
+       virtual ~PCCTS_AST() {;}
+
+       /* This group must be defined for SORCERER to work correctly */
+       virtual PCCTS_AST *right() = 0;
+       virtual PCCTS_AST *down() = 0;
+       virtual void setRight(PCCTS_AST *t) = 0;
+       virtual void setDown(PCCTS_AST *t) = 0;
+// we define these so ANTLR doesn't have to
+       virtual int type() { return 0; }
+       virtual void setType(int t) {;}
+       virtual PCCTS_AST *shallowCopy() {panic("no shallowCopy() defined"); return NULL;}
+
+       /* These are not needed by ANTLR, but are support functions */
+       virtual PCCTS_AST *deepCopy();  // used by SORCERER in transform mode
+       virtual void addChild(PCCTS_AST *t);
+       virtual void lisp_action(FILE *f) {;}
+       virtual void lisp(FILE *f);
+       static PCCTS_AST *make(PCCTS_AST *rt, ...);
+       virtual PCCTS_AST *ast_find_all(PCCTS_AST *u, PCCTS_AST **cursor);
+       virtual int match(PCCTS_AST *u);
+       virtual void insert_after(PCCTS_AST *b);
+       virtual void append(PCCTS_AST *b);
+       virtual PCCTS_AST *tail();
+       virtual PCCTS_AST *bottom();
+       static  PCCTS_AST *cut_between(PCCTS_AST *a, PCCTS_AST *b);
+//     virtual SList *to_slist();
+       virtual void tfree();
+       int ast_scan(char *templ, ...);
+       virtual int nsiblings();
+       virtual PCCTS_AST *sibling_index(int i);
+
+       void require(int e,char *err){ if ( !e ) panic(err); }
+       virtual void panic(char *err)
+               { fprintf(stderr, "PCCTS_AST: %s\n", err); exit(PCCTS_EXIT_FAILURE); }
+};
+
+#endif /* PCCTSAST_H */