summaryrefslogtreecommitdiff
path: root/rlgen-ruby/rubycodegen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rlgen-ruby/rubycodegen.cpp')
-rw-r--r--rlgen-ruby/rubycodegen.cpp111
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() )