diff options
author | Adrian Thurston <thurston@colm.net> | 2019-09-08 21:11:17 -0600 |
---|---|---|
committer | Adrian Thurston <thurston@colm.net> | 2019-09-08 21:11:17 -0600 |
commit | c860c61607117582abd8f23881eed87957197484 (patch) | |
tree | 4d4e65dddc710e15f008189a9308d95924350c3f /colm/parser.h | |
parent | f37c916aed2600951b8966a86020406b0b0542cf (diff) | |
download | colm-c860c61607117582abd8f23881eed87957197484.tar.gz |
moved the original colm src dir to /colm
Diffstat (limited to 'colm/parser.h')
-rw-r--r-- | colm/parser.h | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/colm/parser.h b/colm/parser.h new file mode 100644 index 00000000..aafa3f2b --- /dev/null +++ b/colm/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 */ + |