summaryrefslogtreecommitdiff
path: root/src/parser.h
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@colm.net>2020-03-14 15:29:52 +0200
committerAdrian Thurston <thurston@colm.net>2020-03-14 15:29:52 +0200
commitf653735830d537715f2885bd832cf04851d35401 (patch)
tree95e6551e39407543366d4f49aedf7b78c6e8bbe1 /src/parser.h
parentbcc54d5df10cf425e7134b06f70d7ffe1abee4e4 (diff)
downloadcolm-f653735830d537715f2885bd832cf04851d35401.tar.gz
moved source files into commit repository
Diffstat (limited to 'src/parser.h')
-rw-r--r--src/parser.h197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/parser.h b/src/parser.h
new file mode 100644
index 00000000..aafa3f2b
--- /dev/null
+++ b/src/parser.h
@@ -0,0 +1,197 @@
+/*
+ * Copyright 2013-2018 Adrian Thurston <thurston@colm.net>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef _COLM_PARSER_H
+#define _COLM_PARSER_H
+
+#include <iostream>
+
+#include <avltree.h>
+
+#include "compiler.h"
+#include "parser.h"
+
+#define PROPERTY_REDUCE_FIRST 0x1
+
+struct BaseParser
+{
+ BaseParser( Compiler *pd )
+ : pd(pd), enterRl(false)
+ {}
+
+ virtual ~BaseParser() {}
+
+ Compiler *pd;
+
+ RegionSetVect regionStack;
+ NamespaceVect namespaceStack;
+ ReductionVect reductionStack;
+ StructStack structStack;
+ ObjectDef *localFrameTop;
+ NameScope *scopeTop;
+
+ bool enterRl;
+
+ bool insideRegion()
+ { return regionStack.length() > 0; }
+
+ StructDef *curStruct()
+ { return structStack.length() == 0 ? 0 : structStack.top(); }
+
+ Namespace *curNspace()
+ { return namespaceStack.top(); }
+
+ NameScope *curScope()
+ { return scopeTop; }
+
+ ObjectDef *curLocalFrame()
+ { return localFrameTop; }
+
+ Reduction *curReduction()
+ { return reductionStack.top(); }
+
+ /* Lexical feedback. */
+
+ void listElDef( String name );
+ void mapElDef( String name, TypeRef *keyType );
+
+ void argvDecl();
+ void init();
+ void addRegularDef( const InputLoc &loc, Namespace *nspace,
+ const String &name, LexJoin *join );
+ TokenRegion *createRegion( const InputLoc &loc, RegionImpl *impl );
+ Namespace *createRootNamespace();
+ Namespace *createNamespace( const InputLoc &loc, const String &name );
+ void pushRegionSet( const InputLoc &loc );
+ void popRegionSet();
+ void addProduction( const InputLoc &loc, const String &name,
+ ProdElList *prodElList, bool commit,
+ CodeBlock *redBlock, LangEl *predOf );
+ void addArgvList();
+ void addStdsList();
+ LexJoin *literalJoin( const InputLoc &loc, const String &data );
+
+ Reduction *createReduction( const InputLoc loc, const String &name );
+
+ void defineToken( const InputLoc &loc, String name, LexJoin *join,
+ ObjectDef *objectDef, CodeBlock *transBlock,
+ bool ignore, bool noPreIgnore, bool noPostIgnore );
+
+ void zeroDef( const InputLoc &loc, const String &name );
+ void literalDef( const InputLoc &loc, const String &data,
+ bool noPreIgnore, bool noPostIgnore );
+
+ ObjectDef *blockOpen();
+ void blockClose();
+
+ void inHostDef( const String &hostCall, ObjectDef *localFrame,
+ ParameterList *paramList, TypeRef *typeRef,
+ const String &name, bool exprt );
+ void functionDef( StmtList *stmtList, ObjectDef *localFrame,
+ ParameterList *paramList, TypeRef *typeRef,
+ const String &name, bool exprt );
+
+ void iterDef( StmtList *stmtList, ObjectDef *localFrame,
+ ParameterList *paramList, const String &name );
+ LangStmt *globalDef( ObjectField *objField, LangExpr *expr,
+ LangStmt::Type assignType );
+ void cflDef( NtDef *ntDef, ObjectDef *objectDef, LelDefList *defList );
+ ReOrBlock *lexRegularExprData( ReOrBlock *reOrBlock, ReOrItem *reOrItem );
+
+ int lexFactorRepNum( const InputLoc &loc, const String &data );
+ LexFactor *lexRlFactorName( const String &data, const InputLoc &loc );
+ LexFactorAug *lexFactorLabel( const InputLoc &loc, const String &data,
+ LexFactorAug *factorAug );
+ LexJoin *lexOptJoin( LexJoin *join, LexJoin *context );
+ LangExpr *send( const InputLoc &loc, LangVarRef *varRef,
+ ConsItemList *list, bool eof );
+ LangExpr *sendTree( const InputLoc &loc, LangVarRef *varRef,
+ ConsItemList *list, bool eof );
+ LangExpr *parseCmd( const InputLoc &loc, bool tree, bool stop, ObjectField *objField,
+ TypeRef *typeRef, FieldInitVect *fieldInitVect, ConsItemList *list,
+ bool used, bool reduce, bool read, const String &reducer );
+ PatternItemList *consPatternEl( LangVarRef *varRef, PatternItemList *list );
+ PatternItemList *patternElNamed( const InputLoc &loc, LangVarRef *varRef,
+ NamespaceQual *nspaceQual, const String &data, RepeatType repeatType );
+ PatternItemList *patternElType( const InputLoc &loc, LangVarRef *varRef,
+ NamespaceQual *nspaceQual, const String &data, RepeatType repeatType );
+ PatternItemList *patListConcat( PatternItemList *list1, PatternItemList *list2 );
+ ConsItemList *consListConcat( ConsItemList *list1, ConsItemList *list2 );
+ LangStmt *forScope( const InputLoc &loc, const String &data,
+ NameScope *scope, TypeRef *typeRef, IterCall *iterCall, StmtList *stmtList );
+ void preEof( const InputLoc &loc, StmtList *stmtList, ObjectDef *localFrame );
+
+ ProdEl *prodElName( const InputLoc &loc, const String &data,
+ NamespaceQual *nspaceQual, ObjectField *objField, RepeatType repeatType,
+ bool commit );
+ ProdEl *prodElLiteral( const InputLoc &loc, const String &data,
+ NamespaceQual *nspaceQual, ObjectField *objField, RepeatType repeatType,
+ bool commit );
+ ConsItemList *consElLiteral( const InputLoc &loc, TypeRef *consTypeRef,
+ const String &data, NamespaceQual *nspaceQual );
+ Production *production( const InputLoc &loc, ProdElList *prodElList,
+ String name, bool commit, CodeBlock *codeBlock, LangEl *predOf );
+ void objVarDef( ObjectDef *objectDef, ObjectField *objField );
+ LelDefList *prodAppend( LelDefList *defList, Production *definition );
+
+ LangExpr *construct( const InputLoc &loc, ObjectField *objField,
+ ConsItemList *list, TypeRef *typeRef, FieldInitVect *fieldInitVect );
+ LangExpr *match( const InputLoc &loc, LangVarRef *varRef,
+ PatternItemList *list );
+ LangExpr *prodCompare( const InputLoc &loc, LangVarRef *varRef,
+ const String &prod, LangExpr *matchExpr );
+ LangStmt *varDef( ObjectField *objField,
+ LangExpr *expr, LangStmt::Type assignType );
+ LangStmt *exportStmt( ObjectField *objField, LangStmt::Type assignType, LangExpr *expr );
+
+
+ LangExpr *require( const InputLoc &loc, LangVarRef *varRef, PatternItemList *list );
+ void structVarDef( const InputLoc &loc, ObjectField *objField );
+ void structHead( const InputLoc &loc, Namespace *inNspace,
+ const String &data, ObjectDef::Type objectType );
+ StmtList *appendStatement( StmtList *stmtList, LangStmt *stmt );
+ ParameterList *appendParam( ParameterList *paramList, ObjectField *objField );
+ ObjectField *addParam( const InputLoc &loc,
+ ObjectField::Type type, TypeRef *typeRef, const String &name );
+ PredDecl *predTokenName( const InputLoc &loc, NamespaceQual *qual, const String &data );
+ PredDecl *predTokenLit( const InputLoc &loc, const String &data,
+ NamespaceQual *nspaceQual );
+ void alias( const InputLoc &loc, const String &data, TypeRef *typeRef );
+ void precedenceStmt( PredType predType, PredDeclList *predDeclList );
+ ProdElList *appendProdEl( ProdElList *prodElList, ProdEl *prodEl );
+
+ void pushScope();
+ void popScope();
+
+ virtual void go( long activeRealm ) = 0;
+
+ BstSet<String, ColmCmpStr> genericElDefined;
+
+ NamespaceQual *emptyNspaceQual()
+ {
+ return NamespaceQual::cons( curNspace() );
+ }
+
+};
+
+#endif /* _COLM_PARSER_H */
+