From 9a3bfdba843f7eaf0b3ba64ec14dc75546b4fe31 Mon Sep 17 00:00:00 2001 From: Adrian Thurston Date: Sat, 28 Jul 2012 10:45:11 -0400 Subject: 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. --- src/bytecode.c | 14 ++++++++++++++ src/bytecode.h | 8 ++++++++ src/parsedata.h | 1 + src/synthesis.cc | 29 ++++++++++++++++++++++++++++- src/tree.c | 14 ++++++++++++++ src/tree.h | 1 + 6 files changed, 66 insertions(+), 1 deletion(-) 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() diff --git a/src/tree.c b/src/tree.c index 14f7d81f..17b1f537 100644 --- a/src/tree.c +++ b/src/tree.c @@ -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; diff --git a/src/tree.h b/src/tree.h index 29c0ee74..8a19bf96 100644 --- a/src/tree.h +++ b/src/tree.h @@ -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 ); -- cgit v1.2.1