summaryrefslogtreecommitdiff
path: root/colm/tree.h
diff options
context:
space:
mode:
Diffstat (limited to 'colm/tree.h')
-rw-r--r--colm/tree.h356
1 files changed, 356 insertions, 0 deletions
diff --git a/colm/tree.h b/colm/tree.h
new file mode 100644
index 00000000..e0d390a8
--- /dev/null
+++ b/colm/tree.h
@@ -0,0 +1,356 @@
+/*
+ * Copyright 2010-2012 Adrian Thurston <thurston@complang.org>
+ */
+
+/* This file is part of Colm.
+ *
+ * Colm is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Colm is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Colm; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef __COLM_TREE_H
+#define __COLM_TREE_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#include <colm/colm.h>
+
+typedef unsigned char Code;
+typedef unsigned long Word;
+typedef unsigned long Half;
+struct Bindings;
+
+typedef struct _File
+{
+ struct _File *prev;
+ struct _File *next;
+} File;
+
+typedef struct _Location
+{
+ File *file;
+ long line;
+ long column;
+ long byte;
+} Location;
+
+/* Header located just before string data. */
+typedef struct _Head
+{
+ const char *data;
+ long length;
+ Location *location;
+} Head;
+
+typedef struct ColmKid
+{
+ /* The tree needs to be first since pointers to kids are used to reference
+ * trees on the stack. A pointer to the word that is a Tree* is cast to
+ * a Kid*. */
+ struct ColmTree *tree;
+ struct ColmKid *next;
+ unsigned char flags;
+} Kid;
+
+typedef struct _Ref
+{
+ struct ColmKid *kid;
+ struct _Ref *next;
+} Ref;
+
+typedef struct ColmTree
+{
+ /* First four will be overlaid in other structures. */
+ short id;
+ unsigned short flags;
+ long refs;
+ Kid *child;
+
+ Head *tokdata;
+
+ /* FIXME: this needs to go somewhere else. Will do for now. */
+ unsigned short prodNum;
+} Tree;
+
+
+typedef struct _TreePair
+{
+ Tree *key;
+ Tree *val;
+} TreePair;
+
+typedef struct _ParseTree
+{
+ short id;
+ unsigned short flags;
+
+ struct _ParseTree *child;
+ struct _ParseTree *next;
+ struct _ParseTree *leftIgnore;
+ struct _ParseTree *rightIgnore;
+ Kid *shadow;
+
+ /* Parsing algorithm. */
+ long state;
+ long region;
+ short causeReduce;
+
+ /* FIXME: unify probably. */
+ char retryLower;
+ char retryUpper;
+} ParseTree;
+
+typedef struct _Int
+{
+ /* Must overlay Tree. */
+ short id;
+ unsigned short flags;
+ long refs;
+ Kid *child;
+
+ long value;
+} Int;
+
+typedef struct _Pointer
+{
+ /* Must overlay Tree. */
+ short id;
+ unsigned short flags;
+ long refs;
+ Kid *child;
+
+ Kid *value;
+} Pointer;
+
+typedef struct _Str
+{
+ /* Must overlay Tree. */
+ short id;
+ unsigned short flags;
+ long refs;
+ Kid *child;
+
+ Head *value;
+} Str;
+
+typedef struct _ListEl
+{
+ /* Must overlay kid. */
+ Tree *value;
+ struct _ListEl *next;
+ struct _ListEl *prev;
+} ListEl;
+
+/*
+ * Maps
+ */
+typedef struct _GenericInfo
+{
+ long type;
+ long typeArg;
+ long keyOffset;
+ long keyType;
+ long langElId;
+ long parserId;
+} GenericInfo;
+
+typedef struct _List
+{
+ /* Must overlay Tree. */
+ short id;
+ unsigned short flags;
+ long refs;
+ ListEl *head;
+
+ ListEl *tail;
+ long listLen;
+ GenericInfo *genericInfo;
+
+} List;
+
+typedef struct _Stream
+{
+ /* Must overlay Tree. */
+ short id;
+ unsigned short flags;
+ long refs;
+ Kid *child;
+
+ FILE *file;
+ SourceStream *in;
+} Stream;
+
+typedef struct _Input
+{
+ /* Must overlay Tree. */
+ short id;
+ unsigned short flags;
+ long refs;
+ Kid *child;
+
+ InputStream *in;
+} Input;
+
+typedef struct _Parser
+{
+ /* Must overlay Tree. */
+ short id;
+ unsigned short flags;
+ long refs;
+ Kid *child;
+
+ GenericInfo *genericInfo;
+
+ struct _PdaRun *pdaRun;
+ struct _FsmRun *fsmRun;
+ struct _Input *input;
+ Tree *result;
+} Parser;
+
+typedef struct _TreeIter
+{
+ Ref rootRef;
+ Ref ref;
+ long searchId;
+ Tree **stackRoot;
+ long stackSize;
+} TreeIter;
+
+/* This must overlay tree iter because some of the same bytecodes are used. */
+typedef struct _RevTreeIter
+{
+ Ref rootRef;
+ Ref ref;
+ long searchId;
+ Tree **stackRoot;
+ long stackSize;
+
+ /* For detecting a split at the leaf. */
+ Kid *kidAtYield;
+ long children;
+ Kid **cur;
+} RevTreeIter;
+
+
+typedef struct _UserIter
+{
+ /* The current item. */
+ Ref ref;
+ Tree **stackRoot;
+ long argSize;
+ long stackSize;
+ Code *resume;
+ Tree **frame;
+ long searchId;
+} UserIter;
+
+
+void treeUpref( Tree *tree );
+void treeDownref( struct ColmProgram *prg, Tree **sp, Tree *tree );
+long cmpTree( struct ColmProgram *prg, const Tree *tree1, const Tree *tree2 );
+
+Tree *pushRightIgnore( struct ColmProgram *prg, Tree *pushTo, Tree *rightIgnore );
+Tree *pushLeftIgnore( struct ColmProgram *prg, Tree *pushTo, Tree *leftIgnore );
+Tree *popRightIgnore( struct ColmProgram *prg, Tree **sp, Tree *popFrom, Tree **rightIgnore );
+Tree *popLeftIgnore( struct ColmProgram *prg, Tree **sp, Tree *popFrom, Tree **leftIgnore );
+Tree *treeLeftIgnore( struct ColmProgram *prg, Tree *tree );
+Tree *treeRightIgnore( struct ColmProgram *prg, Tree *tree );
+Kid *treeLeftIgnoreKid( struct ColmProgram *prg, Tree *tree );
+Kid *treeRightIgnoreKid( struct ColmProgram *prg, Tree *tree );
+Kid *treeChild( struct ColmProgram *prg, const Tree *tree );
+Kid *treeAttr( struct ColmProgram *prg, const Tree *tree );
+Kid *kidListConcat( Kid *list1, Kid *list2 );
+Kid *treeExtractChild( struct ColmProgram *prg, Tree *tree );
+Kid *reverseKidList( Kid *kid );
+
+Tree *constructInteger( struct ColmProgram *prg, long i );
+Tree *constructPointer( struct ColmProgram *prg, Tree *tree );
+Tree *constructTerm( struct ColmProgram *prg, Word id, Head *tokdata );
+Tree *constructReplacementTree( Kid *kid, Tree **bindings, struct ColmProgram *prg, long pat );
+Tree *createGeneric( struct ColmProgram *prg, long genericId );
+Tree *constructToken( struct ColmProgram *prg, Tree **root, long nargs );
+Tree *constructInput( struct ColmProgram *prg );
+
+
+int testFalse( struct ColmProgram *prg, Tree *tree );
+Tree *makeTree( struct ColmProgram *prg, Tree **root, long nargs );
+Stream *openFile( struct ColmProgram *prg, Tree *name, Tree *mode );
+Stream *openStreamFd( struct ColmProgram *prg, long fd );
+Kid *copyIgnoreList( struct ColmProgram *prg, Kid *ignoreHeader );
+Kid *copyKidList( struct ColmProgram *prg, Kid *kidList );
+void streamFree( struct ColmProgram *prg, Stream *s );
+Tree *copyTree( struct ColmProgram *prg, Tree *tree, Kid *oldNextDown, Kid **newNextDown );
+
+Tree *getPtrVal( Pointer *ptr );
+Tree *getPtrValSplit( struct ColmProgram *prg, Pointer *ptr );
+Tree *getField( Tree *tree, Word field );
+Tree *getFieldSplit( struct ColmProgram *prg, Tree *tree, Word field );
+Tree *getRhsEl( struct ColmProgram *prg, Tree *lhs, long position );
+void setField( struct ColmProgram *prg, Tree *tree, long field, Tree *value );
+
+void setTriterCur( struct ColmProgram *prg, TreeIter *iter, Tree *tree );
+void setUiterCur( struct ColmProgram *prg, UserIter *uiter, Tree *tree );
+void refSetValue( Ref *ref, Tree *v );
+Tree *treeSearch( struct ColmProgram *prg, Kid *kid, long id );
+Tree *treeSearch2( struct ColmProgram *prg, Tree *tree, long id );
+
+int matchPattern( Tree **bindings, struct ColmProgram *prg, long pat, Kid *kid, int checkNext );
+Tree *treeIterDerefCur( TreeIter *iter );
+
+/* For making references of attributes. */
+Kid *getFieldKid( Tree *tree, Word field );
+
+Tree *copyRealTree( struct ColmProgram *prg, Tree *tree, Kid *oldNextDown, Kid **newNextDown );
+void splitIterCur( struct ColmProgram *prg, Tree ***psp, TreeIter *iter );
+Tree *setListMem( List *list, Half field, Tree *value );
+
+void listAppend2( struct ColmProgram *prg, List *list, Tree *val );
+Tree *listRemoveEnd( struct ColmProgram *prg, List *list );
+Tree *getListMem( List *list, Word field );
+Tree *getListMemSplit( struct ColmProgram *prg, List *list, Word field );
+Tree *getParserMem( Parser *parser, Word field );
+
+Tree *treeIterAdvance( struct ColmProgram *prg, Tree ***psp, TreeIter *iter );
+Tree *treeIterNextChild( struct ColmProgram *prg, Tree ***psp, TreeIter *iter );
+Tree *treeRevIterPrevChild( struct ColmProgram *prg, Tree ***psp, RevTreeIter *iter );
+Tree *treeIterNextRepeat( struct ColmProgram *prg, Tree ***psp, TreeIter *iter );
+Tree *treeIterPrevRepeat( struct ColmProgram *prg, Tree ***psp, TreeIter *iter );
+
+/* An automatically grown buffer for collecting tokens. Always reuses space;
+ * never down resizes. */
+typedef struct _StrCollect
+{
+ char *data;
+ int allocated;
+ int length;
+} StrCollect;
+
+void initStrCollect( StrCollect *collect );
+void strCollectDestroy( StrCollect *collect );
+void strCollectAppend( StrCollect *collect, const char *data, long len );
+void strCollectClear( StrCollect *collect );
+Tree *treeTrim( struct ColmProgram *prg, Tree **sp, Tree *tree );
+
+void printTreeCollect( struct ColmProgram *prg, Tree **sp, StrCollect *collect, Tree *tree, int trim );
+void printTreeFile( struct ColmProgram *prg, Tree **sp, FILE *out, Tree *tree, int trim );
+void printXmlStdout( struct ColmProgram *prg, Tree **sp, Tree *tree, int commAttr, int trim );
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif
+