summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2012-07-28 10:45:11 -0400
committerAdrian Thurston <thurston@complang.org>2012-07-28 10:45:11 -0400
commit9a3bfdba843f7eaf0b3ba64ec14dc75546b4fe31 (patch)
tree3482818aee4a9af39327cd7ae1462ec6ce229633
parent3dc9b0d5134d8d726773f99de1e551f5860f6d2c (diff)
downloadcolm-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.c14
-rw-r--r--src/bytecode.h8
-rw-r--r--src/parsedata.h1
-rw-r--r--src/synthesis.cc29
-rw-r--r--src/tree.c14
-rw-r--r--src/tree.h1
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()
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 );