diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/commit.c | 24 | ||||
-rw-r--r-- | src/compiler.h | 8 | ||||
-rw-r--r-- | src/consinit.cc | 2 | ||||
-rw-r--r-- | src/pdarun.h | 7 | ||||
-rw-r--r-- | src/reduce.cc | 119 |
5 files changed, 96 insertions, 64 deletions
diff --git a/src/commit.c b/src/commit.c index 2d1d84d5..b21fa7b5 100644 --- a/src/commit.c +++ b/src/commit.c @@ -82,28 +82,6 @@ static int been_committed( parse_tree_t *parse_tree ) return parse_tree->flags & PF_COMMITTED; } -void commit_clear( program_t *prg, tree_t **root, struct pda_run *pda_run ) -{ - tree_t **sp = root; - parse_tree_t *pt = pda_run->stack_top; - - /* The top level of the stack is linked right to left. This is the - * traversal order we need for committing. */ - while ( pt != 0 && !been_committed( pt ) ) { - vm_push_ptree( pt ); - pt = pt->next; - } - - while ( sp != root ) { - pt = vm_pop_ptree(); - - commit_clear_parse_tree( prg, sp, pda_run, pt->child ); - - pt->flags |= PF_COMMITTED; - pt = pt->next; - } -} - void commit_reduce( program_t *prg, tree_t **root, struct pda_run *pda_run ) { tree_t **sp = root; @@ -119,7 +97,7 @@ void commit_reduce( program_t *prg, tree_t **root, struct pda_run *pda_run ) while ( sp != root ) { pt = vm_pop_ptree(); - commit_forward_recurse( prg, sp, pda_run, pt ); + commit_reduce_forward( prg, sp, pda_run, pt ); pt->child = 0; pt->flags |= PF_COMMITTED; diff --git a/src/compiler.h b/src/compiler.h index 6d5d7f96..5bc58e2b 100644 --- a/src/compiler.h +++ b/src/compiler.h @@ -1009,11 +1009,13 @@ struct Compiler void declareReVars(); + void loadRefs( Production *production, const ReduceTextItemList &list ); + void writeHostCall(); void writeCommit(); - void writeHostItemList( LangEl *prodName, const ReduceTextItemList &list ); - void writeHostItemList( LangEl *prodName, int prodNum, - const ReduceTextItemList &list ); + void writeRhsRef( Production *production, ReduceTextItem *i ); + void writeLhsRef( Production *production, ReduceTextItem *i ); + void writeHostItemList( Production *production, const ReduceTextItemList &list ); void writeCommitStub(); }; diff --git a/src/consinit.cc b/src/consinit.cc index 7519f8bf..c0a1196a 100644 --- a/src/consinit.cc +++ b/src/consinit.cc @@ -36,7 +36,7 @@ extern "C" tree_t **host_call( program_t *prg, long code, tree_t **sp ) return 0; } -extern "C" void commit_forward_recurse( program_t *prg, tree_t **root, +extern "C" void commit_reduce_forward( program_t *prg, tree_t **root, struct pda_run *pda_run, parse_tree_t *pt ) { commit_clear_parse_tree( prg, root, pda_run, pt->child ); diff --git a/src/pdarun.h b/src/pdarun.h index ebfd7ea1..20f6e85c 100644 --- a/src/pdarun.h +++ b/src/pdarun.h @@ -451,11 +451,10 @@ long colm_parse_undo_frag( struct colm_program *prg, tree_t **sp, struct pda_run void commit_clear_parse_tree( program_t *prg, tree_t **sp, struct pda_run *pda_run, parse_tree_t *pt ); -void commit_forward_recurse( program_t *prg, tree_t **root, +void commit_reduce_forward( program_t *prg, tree_t **root, struct pda_run *pda_run, parse_tree_t *pt ); - -void commit_reduce( program_t *prg, tree_t **root, struct pda_run *pda_run ); -void commit_clear( program_t *prg, tree_t **root, struct pda_run *pda_run ); +void commit_reduce( program_t *prg, tree_t **root, + struct pda_run *pda_run ); long commit_union_sz(); diff --git a/src/reduce.cc b/src/reduce.cc index c8627308..3a547c46 100644 --- a/src/reduce.cc +++ b/src/reduce.cc @@ -43,7 +43,7 @@ void Compiler::writeCommitStub() { *outStream << - "void commit_forward_recurse( program_t *prg, tree_t **root,\n" + "void commit_reduce_forward( program_t *prg, tree_t **root,\n" " struct pda_run *pda_run, parse_tree_t *pt )\n" "{\n" " commit_clear_parse_tree( prg, root, pda_run, pt->child );\n" @@ -54,42 +54,94 @@ void Compiler::writeCommitStub() ; } -void Compiler::writeHostItemList( LangEl *prodName, int prodNum, +void Compiler::loadRefs( Production *production, const ReduceTextItemList &list ) +{ + ObjectDef *objectDef = production->prodName->objectDef; + Vector<ProdEl*> rhsUsed; + rhsUsed.setAsNew( production->prodElList->length() ); + + bool lhsUsed = false; + for ( ReduceTextItemList::Iter i = list; i.lte(); i++ ) { + if ( i->type == ReduceTextItem::LhsRef ) { + lhsUsed = true; + } + + if ( i->type == ReduceTextItem::RhsRef ) { + String name( i->txt.data + 1, i->txt.length() - 1 ); + ObjectField *field = objectDef->rootScope->findField( name ); + if ( field != 0 ) { + for ( Vector<RhsVal>::Iter r = field->rhsVal; r.lte(); r++ ) { + if ( r->prodEl->production == production ) + rhsUsed[r->prodEl->pos] = r->prodEl; + } + } + } + } + + if ( lhsUsed ) { + *outStream << + " lel_" << production->prodName->fullName << " *_lhs = " + "&((commit_reduce_union*)(lel+1))->" << + production->prodName->fullName << ";\n"; + } + + for ( Vector<ProdEl*>::Iter rhs = rhsUsed; rhs.lte(); rhs++ ) { + if ( *rhs != 0 ) { + ProdEl *prodEl = *rhs; + if ( prodEl->production == production ) { + if ( prodEl->langEl->type == LangEl::Term ) { + *outStream << + " colm_data *_rhs" << rhs.pos() << " = " + "get_rhs_el_kid( prg, kid->tree, " + << prodEl->pos << ")->tree->tokdata;\n"; + } + else { + *outStream << + "lel_" << prodEl->langEl->fullName << " *" + "_rhs" << rhs.pos() << " = &((commit_reduce_union*)" + "(get_rhs_parse_tree( prg, lel, " << + prodEl->pos << ")+1))->" << + prodEl->langEl->fullName << ";\n"; + } + } + + } + } +} + +void Compiler::writeRhsRef( Production *production, ReduceTextItem *i ) +{ + ObjectDef *objectDef = production->prodName->objectDef; + String name( i->txt.data + 1, i->txt.length() - 1 ); + + /* Find the field in the rhsVal using capture field. */ + ObjectField *field = objectDef->rootScope->findField( name ); + if ( field != 0 ) { + for ( Vector<RhsVal>::Iter r = field->rhsVal; + r.lte(); r++ ) + { + if ( r->prodEl->production == production ) + *outStream << "_rhs" << r->prodEl->pos; + } + } +} + +void Compiler::writeLhsRef( Production *production, ReduceTextItem *i ) +{ + *outStream << "_lhs"; +} + +void Compiler::writeHostItemList( Production *production, const ReduceTextItemList &list ) { for ( ReduceTextItemList::Iter i = list; i.lte(); i++ ) { switch ( i->type ) { - case ReduceTextItem::RhsRef: { - String name( i->txt.data + 1, i->txt.length() - 1 ); - - /* Find the field in the rhsVal using capture field. */ - ObjectField *field = prodName->objectDef->rootScope->findField( name ); - if ( field != 0 ) { - for ( Vector<RhsVal>::Iter r = field->rhsVal; - r.lte(); r++ ) - { - if ( r->prodEl->production->prodNum == prodNum ) { - if ( r->prodEl->langEl->type == LangEl::Term ) { - *outStream << "(get_rhs_el_kid( prg, kid->tree, " - << r->prodEl->pos << ")->tree->tokdata)"; - } - else { - *outStream << "(&((commit_reduce_union*)" - "(get_rhs_parse_tree( prg, lel, " << - r->prodEl->pos << ")+1))->" << - r->prodEl->langEl->fullName << ")"; - } - } - } - } - + case ReduceTextItem::RhsRef: + writeRhsRef( production, i ); break; - } case ReduceTextItem::LhsRef: - *outStream << "(&((commit_reduce_union*)(lel+1))->" << - prodName->fullName << ")"; + writeLhsRef( production, i ); break; - case ReduceTextItem::Txt: *outStream << i->txt; break; @@ -123,7 +175,7 @@ void Compiler::writeCommit() "struct lel_" << rdi->nonTerm->uniqueType->langEl->fullName << "\n" "{"; - writeHostItemList( 0, 0, rdi->itemList ); + writeHostItemList( 0, rdi->itemList ); *outStream << "};\n"; @@ -151,7 +203,7 @@ void Compiler::writeCommit() *outStream << "\n" - "void commit_forward_recurse( program_t *prg, tree_t **root,\n" + "void commit_reduce_forward( program_t *prg, tree_t **root,\n" " struct pda_run *pda_run, parse_tree_t *pt )\n" "{\n" " tree_t **sp = root;\n" @@ -192,7 +244,8 @@ void Compiler::writeCommit() " case " << lelId << ": {\n" " if ( kid->tree->prod_num == " << prodNum << " ) {\n"; - writeHostItemList( rdi->production->prodName, prodNum, rdi->itemList ); + loadRefs( rdi->production, rdi->itemList ); + writeHostItemList( rdi->production, rdi->itemList ); *outStream << " }\n" |