diff options
Diffstat (limited to 'rlgen-ruby/rubycodegen.cpp')
-rw-r--r-- | rlgen-ruby/rubycodegen.cpp | 111 |
1 files changed, 100 insertions, 11 deletions
diff --git a/rlgen-ruby/rubycodegen.cpp b/rlgen-ruby/rubycodegen.cpp index 209e80a0..2f386814 100644 --- a/rlgen-ruby/rubycodegen.cpp +++ b/rlgen-ruby/rubycodegen.cpp @@ -292,7 +292,7 @@ void RubyCodeGen::writeExec() out << INDENT_S() << P() << " += 1" ; if ( hasEnd ) - out << INDENT_S() << "_resume.call if p != pe"; + out << INDENT_S() << "_resume.call if " << P() << " != " << PE(); out << INDENT_D() << "end # cc _out" ; } @@ -1246,30 +1246,119 @@ std::ostream &RubyCodeGen::ACTIONS_ARRAY() } -string RubyCodeGen::CS() +string RubyCodeGen::ACCESS() { ostringstream ret; - if ( curStateExpr != 0 ) { - /* Emit the user supplied method of retrieving the key. */ - ret << "("; - INLINE_LIST( ret, curStateExpr, 0, false ); - ret << ")"; + if ( accessExpr != 0 ) + INLINE_LIST( ret, accessExpr, 0, false ); + return ret.str(); +} + +string RubyCodeGen::P() +{ + ostringstream ret; + if ( pExpr == 0 ) + ret << "p"; + else { + //ret << "("; + INLINE_LIST( ret, pExpr, 0, false ); + //ret << ")"; } + return ret.str(); +} + +string RubyCodeGen::PE() +{ + ostringstream ret; + if ( peExpr == 0 ) + ret << "pe"; else { - /* Expression for retrieving the key, use simple dereference. */ + //ret << "("; + INLINE_LIST( ret, peExpr, 0, false ); + //ret << ")"; + } + return ret.str(); +} + +string RubyCodeGen::CS() +{ + ostringstream ret; + if ( csExpr == 0 ) ret << ACCESS() << "cs"; + else { + //ret << "("; + INLINE_LIST( ret, csExpr, 0, false ); + //ret << ")"; } return ret.str(); } -string RubyCodeGen::ACCESS() +string RubyCodeGen::TOP() { ostringstream ret; - if ( accessExpr != 0 ) - INLINE_LIST( ret, accessExpr, 0, false ); + if ( topExpr == 0 ) + ret << ACCESS() + "top"; + else { + //ret << "("; + INLINE_LIST( ret, topExpr, 0, false ); + //ret << ")"; + } + return ret.str(); +} + +string RubyCodeGen::STACK() +{ + ostringstream ret; + if ( stackExpr == 0 ) + ret << ACCESS() + "stack"; + else { + //ret << "("; + INLINE_LIST( ret, stackExpr, 0, false ); + //ret << ")"; + } + return ret.str(); +} + +string RubyCodeGen::ACT() +{ + ostringstream ret; + if ( actExpr == 0 ) + ret << ACCESS() + "act"; + else { + //ret << "("; + INLINE_LIST( ret, actExpr, 0, false ); + //ret << ")"; + } return ret.str(); } +string RubyCodeGen::TOKSTART() +{ + ostringstream ret; + if ( tokstartExpr == 0 ) + ret << ACCESS() + "tokstart"; + else { + //ret << "("; + INLINE_LIST( ret, tokstartExpr, 0, false ); + //ret << ")"; + } + return ret.str(); +} + +string RubyCodeGen::TOKEND() +{ + ostringstream ret; + if ( tokendExpr == 0 ) + ret << ACCESS() + "tokend"; + else { + //ret << "("; + INLINE_LIST( ret, tokendExpr, 0, false ); + //ret << ")"; + } + return ret.str(); +} + + string RubyCodeGen::GET_WIDE_KEY() { if ( redFsm->anyConditions() ) |