summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-10-07 13:23:27 -0400
committerAdrian Thurston <thurston@complang.org>2015-10-07 13:23:27 -0400
commitccaa108e29f630cea0033d6719f524625d1768b0 (patch)
treea71335f637b193cdf6315da1f491c9f4b1e10263 /src
parentac382923c5a772a9e2d64d2a4e69c04814cff82b (diff)
downloadcolm-ccaa108e29f630cea0033d6719f524625d1768b0.tar.gz
declare lhs and rhs vars before use
Diffstat (limited to 'src')
-rw-r--r--src/commit.c24
-rw-r--r--src/compiler.h8
-rw-r--r--src/consinit.cc2
-rw-r--r--src/pdarun.h7
-rw-r--r--src/reduce.cc119
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"