diff options
author | Adrian Thurston <thurston@complang.org> | 2012-07-28 10:45:11 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2012-07-28 10:45:11 -0400 |
commit | 9a3bfdba843f7eaf0b3ba64ec14dc75546b4fe31 (patch) | |
tree | 3482818aee4a9af39327cd7ae1462ec6ce229633 | |
parent | 3dc9b0d5134d8d726773f99de1e551f5860f6d2c (diff) | |
download | colm-9a3bfdba843f7eaf0b3ba64ec14dc75546b4fe31.tar.gz |
added .tree member and .eof() function to parser
The .tree is for fetching the built tree. The .eof() function is an alias of
finish(), which is a little more precise with respect to functionality.
-rw-r--r-- | src/bytecode.c | 14 | ||||
-rw-r--r-- | src/bytecode.h | 8 | ||||
-rw-r--r-- | src/parsedata.h | 1 | ||||
-rw-r--r-- | src/synthesis.cc | 29 | ||||
-rw-r--r-- | src/tree.c | 14 | ||||
-rw-r--r-- | src/tree.h | 1 |
6 files changed, 66 insertions, 1 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index dafadbdd..0b9f8e9d 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -3074,6 +3074,20 @@ again: treeDownref( prg, sp, undid ); break; } + case IN_GET_PARSER_MEM_R: { + short field; + read_half( field ); + + debug( REALM_BYTECODE, "IN_GET_PARSER_MEM_R\n" ); + + Tree *obj = vm_pop(); + treeDownref( prg, sp, obj ); + + Tree *val = getParserMem( (Parser*)obj, field ); + treeUpref( val ); + vm_push( val ); + break; + } case IN_MAP_INSERT_WV: { debug( REALM_BYTECODE, "IN_MAP_INSERT_WV\n" ); diff --git a/src/bytecode.h b/src/bytecode.h index fcf96d90..c87f0d7c 100644 --- a/src/bytecode.h +++ b/src/bytecode.h @@ -307,6 +307,14 @@ typedef unsigned char uchar; #define IN_SET_INPUT 0xdf #define IN_GET_INPUT 0xe0 +#define IN_GET_PARSER_MEM_R 0x5b +#define IN_GET_PARSER_MEM_WC 0x00 +#define IN_GET_PARSER_MEM_WV 0x00 +#define IN_GET_PARSER_MEM_BKT 0x00 +#define IN_SET_PARSER_MEM_WC 0x00 +#define IN_SET_PARSER_MEM_WV 0x00 +#define IN_SET_PARSER_MEM_BKT 0x00 + /* Types */ #define TYPE_NIL 0x01 #define TYPE_TREE 0x02 diff --git a/src/parsedata.h b/src/parsedata.h index d961d7f9..41ab9781 100644 --- a/src/parsedata.h +++ b/src/parsedata.h @@ -820,6 +820,7 @@ struct Compiler void initListFields( GenericType *gen ); void initListFunctions( GenericType *gen ); void initVectorFunctions( GenericType *gen ); + void initParserField( GenericType *gen, const char *name, int offset ); void initParserFunctions( GenericType *gen ); void initParserFields( GenericType *gen ); void initCtxField( GenericType *gen ); diff --git a/src/synthesis.cc b/src/synthesis.cc index ed05317c..291f07cf 100644 --- a/src/synthesis.cc +++ b/src/synthesis.cc @@ -2936,10 +2936,35 @@ void Compiler::initVectorFunctions( GenericType *gen ) void Compiler::initParserFunctions( GenericType *gen ) { - initFunction( gen->utArg, gen->objDef, "finish", + initFunction( gen->utArg, gen->objDef, "finish", + IN_PARSE_FINISH_WV, IN_PARSE_FINISH_WC, true ); + + initFunction( gen->utArg, gen->objDef, "eof", IN_PARSE_FINISH_WV, IN_PARSE_FINISH_WC, true ); } +void Compiler::initParserField( GenericType *gen, const char *name, int offset ) +{ + /* Make the type ref and create the field. */ + TypeRef *typeRef = TypeRef::cons( InputLoc(), gen->utArg ); + ObjField *el = new ObjField( InputLoc(), typeRef, name ); + + el->inGetR = IN_GET_PARSER_MEM_R; + el->inGetWC = IN_GET_PARSER_MEM_WC; + el->inGetWV = IN_GET_PARSER_MEM_WV; + el->inSetWC = IN_SET_PARSER_MEM_WC; + el->inSetWV = IN_SET_PARSER_MEM_WV; + + gen->objDef->insertField( el->name, el ); + + el->useOffset = true; + el->beenReferenced = true; + el->beenInitialized = true; + + /* Zero for head, One for tail. */ + el->offset = offset; +} + void Compiler::initCtxField( GenericType *gen ) { LangEl *langEl = gen->utArg->langEl; @@ -2968,6 +2993,8 @@ void Compiler::initParserFields( GenericType *gen ) LangEl *langEl = gen->utArg->langEl; if ( langEl->contextIn != 0 ) initCtxField( gen ); + + initParserField( gen, "tree", 0 ); } void Compiler::initGenericTypes() @@ -1615,6 +1615,20 @@ Tree *getListMem( List *list, Word field ) return result; } +Tree *getParserMem( Parser *parser, Word field ) +{ + Tree *result = 0; + switch ( field ) { + case 0: + result = parser->result; + break; + default: + assert( false ); + break; + } + return result; +} + Tree *getListMemSplit( Program *prg, List *list, Word field ) { Tree *sv = 0; @@ -321,6 +321,7 @@ 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 ); |