summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2007-04-29 03:50:47 +0000
committerAdrian Thurston <thurston@complang.org>2007-04-29 03:50:47 +0000
commit40a0ec58dec7120aceed67a487c53b8c28b2741e (patch)
treeb64362571b6991bd7aa6725f352efd5492750676
parentfa4d8daacbf13234e82298bd3ff3762b88f740ea (diff)
downloadragel-40a0ec58dec7120aceed67a487c53b8c28b2741e.tar.gz
In the variable statement changed the name "curstate" to "cs" (the default
name used for the current state) and implemented the other names as their defaults. Now all variables (p, pe, cs, top, stack, act, tokstart, tokend) can be renamed.
-rw-r--r--ragel/parsedata.cpp35
-rw-r--r--ragel/parsedata.h15
-rw-r--r--ragel/rlparse.kl8
-rw-r--r--ragel/xmlcodegen.cpp100
-rw-r--r--ragel/xmlcodegen.h4
-rw-r--r--redfsm/gendata.cpp9
-rw-r--r--redfsm/gendata.h12
-rw-r--r--redfsm/xmlparse.kh8
-rw-r--r--redfsm/xmlparse.kl30
-rw-r--r--redfsm/xmltags.gperf9
-rw-r--r--rlgen-cd/fsmcodegen.cpp104
-rw-r--r--rlgen-cd/fsmcodegen.h14
-rw-r--r--rlgen-java/javacodegen.cpp104
-rw-r--r--rlgen-java/javacodegen.h16
-rw-r--r--rlgen-ruby/rubycodegen.cpp111
-rw-r--r--rlgen-ruby/rubycodegen.h15
16 files changed, 492 insertions, 102 deletions
diff --git a/ragel/parsedata.cpp b/ragel/parsedata.cpp
index b4e4bb15..206ad502 100644
--- a/ragel/parsedata.cpp
+++ b/ragel/parsedata.cpp
@@ -428,7 +428,14 @@ ParseData::ParseData( char *fileName, char *sectionName,
alphTypeSet(false),
getKeyExpr(0),
accessExpr(0),
- curStateExpr(0),
+ pExpr(0),
+ peExpr(0),
+ csExpr(0),
+ topExpr(0),
+ stackExpr(0),
+ actExpr(0),
+ tokstartExpr(0),
+ tokendExpr(0),
lowerNum(0),
upperNum(0),
fileName(fileName),
@@ -877,6 +884,32 @@ bool ParseData::setAlphType( char *s1 )
return valid;
}
+bool ParseData::setVariable( char *var, InlineList *inlineList )
+{
+ bool set = true;
+
+ if ( strcmp( var, "p" ) == 0 )
+ pExpr = inlineList;
+ else if ( strcmp( var, "pe" ) == 0 )
+ peExpr = inlineList;
+ else if ( strcmp( var, "cs" ) == 0 )
+ csExpr = inlineList;
+ else if ( strcmp( var, "top" ) == 0 )
+ topExpr = inlineList;
+ else if ( strcmp( var, "stack" ) == 0 )
+ stackExpr = inlineList;
+ else if ( strcmp( var, "act" ) == 0 )
+ actExpr = inlineList;
+ else if ( strcmp( var, "tokstart" ) == 0 )
+ tokstartExpr = inlineList;
+ else if ( strcmp( var, "tokend" ) == 0 )
+ tokendExpr = inlineList;
+ else
+ set = false;
+
+ return set;
+}
+
/* Initialize the key operators object that will be referenced by all fsms
* created. */
void ParseData::initKeyOps( )
diff --git a/ragel/parsedata.h b/ragel/parsedata.h
index 330d96ab..2d614aea 100644
--- a/ragel/parsedata.h
+++ b/ragel/parsedata.h
@@ -55,6 +55,7 @@ struct ReOrItem;
struct LongestMatch;
typedef DList<LongestMatch> LmList;
+
/* Graph dictionary. */
struct GraphDictEl
:
@@ -189,6 +190,9 @@ struct ParseData
bool setAlphType( char *s1, char *s2 );
bool setAlphType( char *s1 );
+ /* Override one of the variables ragel uses. */
+ bool setVariable( char *var, InlineList *inlineList );
+
/* Unique actions. */
void removeDups( ActionTable &actionTable );
void removeActionDups( FsmAp *graph );
@@ -254,7 +258,16 @@ struct ParseData
/* Element type and get key expression. */
InlineList *getKeyExpr;
InlineList *accessExpr;
- InlineList *curStateExpr;
+
+ /* Overriding variables. */
+ InlineList *pExpr;
+ InlineList *peExpr;
+ InlineList *csExpr;
+ InlineList *topExpr;
+ InlineList *stackExpr;
+ InlineList *actExpr;
+ InlineList *tokstartExpr;
+ InlineList *tokendExpr;
/* The alphabet range. */
char *lowerNum, *upperNum;
diff --git a/ragel/rlparse.kl b/ragel/rlparse.kl
index 29dd1c20..d6c2c023 100644
--- a/ragel/rlparse.kl
+++ b/ragel/rlparse.kl
@@ -186,11 +186,9 @@ access_spec:
variable_spec:
KW_Variable opt_whitespace TK_Word inline_expr ';' final {
/* FIXME: Need to implement the rest of this. */
- if ( strcmp( $3->data, "curstate" ) == 0 )
- pd->curStateExpr = $4->inlineList;
- else {
- error($3->loc) << "sorry, unimplementd" << endl;
- }
+ bool wasSet = pd->setVariable( $3->data, $4->inlineList );
+ if ( !wasSet )
+ error($3->loc) << "bad variable name" << endl;
};
opt_whitespace: opt_whitespace IL_WhiteSpace;
diff --git a/ragel/xmlcodegen.cpp b/ragel/xmlcodegen.cpp
index eba7e327..248959ad 100644
--- a/ragel/xmlcodegen.cpp
+++ b/ragel/xmlcodegen.cpp
@@ -616,32 +616,6 @@ void XMLCodeGen::writeMachine()
out << " </machine>\n";
}
-void XMLCodeGen::writeAlphType()
-{
- out << " <alphtype>" <<
- (keyOps->alphType - hostLang->hostTypes) << "</alphtype>\n";
-}
-
-void XMLCodeGen::writeGetKeyExpr()
-{
- out << " <getkey>";
- writeInlineList( pd->getKeyExpr, 0 );
- out << "</getkey>\n";
-}
-
-void XMLCodeGen::writeAccessExpr()
-{
- out << " <access>";
- writeInlineList( pd->accessExpr, 0 );
- out << "</access>\n";
-}
-
-void XMLCodeGen::writeCurStateExpr()
-{
- out << " <curstate>";
- writeInlineList( pd->curStateExpr, 0 );
- out << "</curstate>\n";
-}
void XMLCodeGen::writeConditions()
{
@@ -680,16 +654,76 @@ void XMLCodeGen::writeXML()
{
/* Open the definition. */
out << "<ragel_def name=\"" << fsmName << "\">\n";
- writeAlphType();
+
+ /* Alphabet type. */
+ out << " <alphtype>" <<
+ (keyOps->alphType - hostLang->hostTypes) << "</alphtype>\n";
- if ( pd->getKeyExpr != 0 )
- writeGetKeyExpr();
+ /* Getkey expression. */
+ if ( pd->getKeyExpr != 0 ) {
+ out << " <getkey>";
+ writeInlineList( pd->getKeyExpr, 0 );
+ out << "</getkey>\n";
+ }
- if ( pd->accessExpr != 0 )
- writeAccessExpr();
+ /* Access expression. */
+ if ( pd->accessExpr != 0 ) {
+ out << " <access>";
+ writeInlineList( pd->accessExpr, 0 );
+ out << "</access>\n";
+ }
+
+ /*
+ * Variable expressions.
+ */
- if ( pd->curStateExpr != 0 )
- writeCurStateExpr();
+ if ( pd->pExpr != 0 ) {
+ out << " <p_expr>";
+ writeInlineList( pd->pExpr, 0 );
+ out << "</p_expr>\n";
+ }
+
+ if ( pd->peExpr != 0 ) {
+ out << " <pe_expr>";
+ writeInlineList( pd->peExpr, 0 );
+ out << "</pe_expr>\n";
+ }
+
+ if ( pd->csExpr != 0 ) {
+ out << " <cs_expr>";
+ writeInlineList( pd->csExpr, 0 );
+ out << "</cs_expr>\n";
+ }
+
+ if ( pd->topExpr != 0 ) {
+ out << " <top_expr>";
+ writeInlineList( pd->topExpr, 0 );
+ out << "</top_expr>\n";
+ }
+
+ if ( pd->stackExpr != 0 ) {
+ out << " <stack_expr>";
+ writeInlineList( pd->stackExpr, 0 );
+ out << "</stack_expr>\n";
+ }
+
+ if ( pd->actExpr != 0 ) {
+ out << " <act_expr>";
+ writeInlineList( pd->actExpr, 0 );
+ out << "</act_expr>\n";
+ }
+
+ if ( pd->tokstartExpr != 0 ) {
+ out << " <tokstart_expr>";
+ writeInlineList( pd->tokstartExpr, 0 );
+ out << "</tokstart_expr>\n";
+ }
+
+ if ( pd->tokendExpr != 0 ) {
+ out << " <tokend_expr>";
+ writeInlineList( pd->tokendExpr, 0 );
+ out << "</tokend_expr>\n";
+ }
writeExports();
diff --git a/ragel/xmlcodegen.h b/ragel/xmlcodegen.h
index 6c80ac72..6f4823bb 100644
--- a/ragel/xmlcodegen.h
+++ b/ragel/xmlcodegen.h
@@ -107,12 +107,8 @@ private:
void writeExports();
bool writeNameInst( NameInst *nameInst );
void writeEntryPoints();
- void writeGetKeyExpr();
- void writeAccessExpr();
- void writeCurStateExpr();
void writeConditions();
void writeInlineList( InlineList *inlineList, InlineItem *context );
- void writeAlphType();
void writeActionList();
void writeActionTableList();
void reduceTrans( TransAp *trans );
diff --git a/redfsm/gendata.cpp b/redfsm/gendata.cpp
index be229740..a5ff1237 100644
--- a/redfsm/gendata.cpp
+++ b/redfsm/gendata.cpp
@@ -41,7 +41,14 @@ CodeGenData::CodeGenData( ostream &out )
errState(-1),
getKeyExpr(0),
accessExpr(0),
- curStateExpr(0),
+ pExpr(0),
+ peExpr(0),
+ csExpr(0),
+ topExpr(0),
+ stackExpr(0),
+ actExpr(0),
+ tokstartExpr(0),
+ tokendExpr(0),
wantComplete(0),
hasLongestMatch(false),
codeGenErrCount(0),
diff --git a/redfsm/gendata.h b/redfsm/gendata.h
index a5a3d0a6..34d9becb 100644
--- a/redfsm/gendata.h
+++ b/redfsm/gendata.h
@@ -99,7 +99,17 @@ struct CodeGenData
CondSpaceList condSpaceList;
InlineList *getKeyExpr;
InlineList *accessExpr;
- InlineList *curStateExpr;
+
+ /* Overriding variables. */
+ InlineList *pExpr;
+ InlineList *peExpr;
+ InlineList *csExpr;
+ InlineList *topExpr;
+ InlineList *stackExpr;
+ InlineList *actExpr;
+ InlineList *tokstartExpr;
+ InlineList *tokendExpr;
+
KeyOps thisKeyOps;
bool wantComplete;
EntryIdVect entryPointIds;
diff --git a/redfsm/xmlparse.kh b/redfsm/xmlparse.kh
index 85261964..7b1d2a17 100644
--- a/redfsm/xmlparse.kh
+++ b/redfsm/xmlparse.kh
@@ -112,8 +112,12 @@ struct Parser
TAG_hold, TAG_exec, TAG_holdte, TAG_execte, TAG_curs, TAG_targs,
TAG_entry, TAG_data, TAG_lm_switch, TAG_init_act, TAG_set_act,
TAG_set_tokend, TAG_get_tokend, TAG_init_tokstart,
- TAG_set_tokstart, TAG_write, TAG_curstate, TAG_access, TAG_break,
- TAG_arg;
+ TAG_set_tokstart;
+
+ token TAG_write, TAG_access, TAG_break, TAG_arg, TAG_cs_expr;
+
+ token TAG_p_expr, TAG_pe_expr, TAG_cs_expr, TAG_top_expr,
+ TAG_stack_expr, TAG_act_expr, TAG_tokstart_expr, TAG_tokend_expr;
}%%
%% write instance_data;
diff --git a/redfsm/xmlparse.kl b/redfsm/xmlparse.kl
index 11c42e1f..5a969b9e 100644
--- a/redfsm/xmlparse.kl
+++ b/redfsm/xmlparse.kl
@@ -161,9 +161,16 @@ ragel_def_item_list: ;
ragel_def_item: tag_alph_type;
ragel_def_item: tag_getkey_expr;
ragel_def_item: tag_access_expr;
-ragel_def_item: tag_curstate_expr;
ragel_def_item: tag_export_list;
ragel_def_item: tag_machine;
+ragel_def_item: tag_p_expr;
+ragel_def_item: tag_pe_expr;
+ragel_def_item: tag_cs_expr;
+ragel_def_item: tag_top_expr;
+ragel_def_item: tag_stack_expr;
+ragel_def_item: tag_act_expr;
+ragel_def_item: tag_tokstart_expr;
+ragel_def_item: tag_tokend_expr;
tag_export_list: TAG_exports export_list '/' TAG_exports;
@@ -198,10 +205,23 @@ tag_access_expr: TAG_access inline_list '/' TAG_access
cgd->accessExpr = $2->inlineList;
};
-tag_curstate_expr: TAG_curstate inline_list '/' TAG_curstate
- final {
- cgd->curStateExpr = $2->inlineList;
- };
+tag_p_expr: TAG_p_expr inline_list '/' TAG_p_expr
+ final { cgd->pExpr = $2->inlineList; };
+tag_pe_expr: TAG_pe_expr inline_list '/' TAG_pe_expr
+ final { cgd->peExpr = $2->inlineList; };
+tag_cs_expr: TAG_cs_expr inline_list '/' TAG_cs_expr
+ final { cgd->csExpr = $2->inlineList; };
+tag_top_expr: TAG_top_expr inline_list '/' TAG_top_expr
+ final { cgd->topExpr = $2->inlineList; };
+tag_stack_expr: TAG_stack_expr inline_list '/' TAG_stack_expr
+ final { cgd->stackExpr = $2->inlineList; };
+tag_act_expr: TAG_act_expr inline_list '/' TAG_act_expr
+ final { cgd->actExpr = $2->inlineList; };
+tag_tokstart_expr: TAG_tokstart_expr inline_list '/' TAG_tokstart_expr
+ final { cgd->tokstartExpr = $2->inlineList; };
+tag_tokend_expr: TAG_tokend_expr inline_list '/' TAG_tokend_expr
+ final { cgd->tokendExpr = $2->inlineList; };
+
tag_write: tag_write_head write_option_list '/' TAG_write
final {
diff --git a/redfsm/xmltags.gperf b/redfsm/xmltags.gperf
index 7185bab3..be4374e1 100644
--- a/redfsm/xmltags.gperf
+++ b/redfsm/xmltags.gperf
@@ -72,7 +72,6 @@ set_tokend, TAG_set_tokend
init_tokstart, TAG_init_tokstart
set_tokstart, TAG_set_tokstart
write, TAG_write
-curstate, TAG_curstate
access, TAG_access
break, TAG_break
arg, TAG_arg
@@ -82,3 +81,11 @@ cond_list, TAG_cond_list
c, TAG_c
exports, TAG_exports
ex, TAG_ex
+p_expr, TAG_p_expr
+pe_expr, TAG_pe_expr
+cs_expr, TAG_cs_expr
+top_expr, TAG_top_expr
+stack_expr, TAG_stack_expr
+act_expr, TAG_act_expr
+tokstart_expr, TAG_tokstart_expr
+tokend_expr, TAG_tokend_expr
diff --git a/rlgen-cd/fsmcodegen.cpp b/rlgen-cd/fsmcodegen.cpp
index 3ed0bb3c..7fc8d5ea 100644
--- a/rlgen-cd/fsmcodegen.cpp
+++ b/rlgen-cd/fsmcodegen.cpp
@@ -136,27 +136,117 @@ std::ostream &FsmCodeGen::ACTIONS_ARRAY()
}
+string FsmCodeGen::ACCESS()
+{
+ ostringstream ret;
+ if ( accessExpr != 0 )
+ INLINE_LIST( ret, accessExpr, 0, false );
+ return ret.str();
+}
+
+
+string FsmCodeGen::P()
+{
+ ostringstream ret;
+ if ( pExpr == 0 )
+ ret << "p";
+ else {
+ ret << "(";
+ INLINE_LIST( ret, pExpr, 0, false );
+ ret << ")";
+ }
+ return ret.str();
+}
+
+string FsmCodeGen::PE()
+{
+ ostringstream ret;
+ if ( peExpr == 0 )
+ ret << "pe";
+ else {
+ ret << "(";
+ INLINE_LIST( ret, peExpr, 0, false );
+ ret << ")";
+ }
+ return ret.str();
+}
+
string FsmCodeGen::CS()
{
ostringstream ret;
- if ( curStateExpr != 0 ) {
+ if ( csExpr == 0 )
+ ret << ACCESS() << "cs";
+ else {
/* Emit the user supplied method of retrieving the key. */
ret << "(";
- INLINE_LIST( ret, curStateExpr, 0, false );
+ INLINE_LIST( ret, csExpr, 0, false );
ret << ")";
}
+ return ret.str();
+}
+
+string FsmCodeGen::TOP()
+{
+ ostringstream ret;
+ if ( topExpr == 0 )
+ ret << ACCESS() + "top";
else {
- /* Expression for retrieving the key, use simple dereference. */
- ret << ACCESS() << "cs";
+ ret << "(";
+ INLINE_LIST( ret, topExpr, 0, false );
+ ret << ")";
}
return ret.str();
}
-string FsmCodeGen::ACCESS()
+string FsmCodeGen::STACK()
{
ostringstream ret;
- if ( accessExpr != 0 )
- INLINE_LIST( ret, accessExpr, 0, false );
+ if ( stackExpr == 0 )
+ ret << ACCESS() + "stack";
+ else {
+ ret << "(";
+ INLINE_LIST( ret, stackExpr, 0, false );
+ ret << ")";
+ }
+ return ret.str();
+}
+
+string FsmCodeGen::ACT()
+{
+ ostringstream ret;
+ if ( actExpr == 0 )
+ ret << ACCESS() + "act";
+ else {
+ ret << "(";
+ INLINE_LIST( ret, actExpr, 0, false );
+ ret << ")";
+ }
+ return ret.str();
+}
+
+string FsmCodeGen::TOKSTART()
+{
+ ostringstream ret;
+ if ( tokstartExpr == 0 )
+ ret << ACCESS() + "tokstart";
+ else {
+ ret << "(";
+ INLINE_LIST( ret, tokstartExpr, 0, false );
+ ret << ")";
+ }
+ return ret.str();
+}
+
+string FsmCodeGen::TOKEND()
+{
+ ostringstream ret;
+ if ( tokendExpr == 0 )
+ ret << ACCESS() + "tokend";
+ else {
+ ret << "(";
+ INLINE_LIST( ret, tokendExpr, 0, false );
+ ret << ")";
+ }
return ret.str();
}
diff --git a/rlgen-cd/fsmcodegen.h b/rlgen-cd/fsmcodegen.h
index 628f9a92..e0834fc0 100644
--- a/rlgen-cd/fsmcodegen.h
+++ b/rlgen-cd/fsmcodegen.h
@@ -90,16 +90,16 @@ protected:
virtual string GET_KEY();
virtual ostream &SWITCH_DEFAULT() = 0;
- string P() { return "p"; }
- string PE() { return "pe"; }
+ string P();
+ string PE();
string ACCESS();
string CS();
- string STACK() { return ACCESS() + "stack"; }
- string TOP() { return ACCESS() + "top"; }
- string TOKSTART() { return ACCESS() + "tokstart"; }
- string TOKEND() { return ACCESS() + "tokend"; }
- string ACT() { return ACCESS() + "act"; }
+ string STACK();
+ string TOP();
+ string TOKSTART();
+ string TOKEND();
+ string ACT();
string DATA_PREFIX();
string PM() { return "_" + DATA_PREFIX() + "partition_map"; }
diff --git a/rlgen-java/javacodegen.cpp b/rlgen-java/javacodegen.cpp
index 12afca26..1a5cee20 100644
--- a/rlgen-java/javacodegen.cpp
+++ b/rlgen-java/javacodegen.cpp
@@ -1199,30 +1199,120 @@ std::ostream &JavaTabCodeGen::ACTIONS_ARRAY()
}
+string JavaTabCodeGen::ACCESS()
+{
+ ostringstream ret;
+ if ( accessExpr != 0 )
+ INLINE_LIST( ret, accessExpr, 0, false );
+ return ret.str();
+}
+
+string JavaTabCodeGen::P()
+{
+ ostringstream ret;
+ if ( pExpr == 0 )
+ ret << "p";
+ else {
+ ret << "(";
+ INLINE_LIST( ret, pExpr, 0, false );
+ ret << ")";
+ }
+ return ret.str();
+}
+
+string JavaTabCodeGen::PE()
+{
+ ostringstream ret;
+ if ( peExpr == 0 )
+ ret << "pe";
+ else {
+ ret << "(";
+ INLINE_LIST( ret, peExpr, 0, false );
+ ret << ")";
+ }
+ return ret.str();
+}
+
string JavaTabCodeGen::CS()
{
ostringstream ret;
- if ( curStateExpr != 0 ) {
+ if ( csExpr == 0 )
+ ret << ACCESS() << "cs";
+ else {
/* Emit the user supplied method of retrieving the key. */
ret << "(";
- INLINE_LIST( ret, curStateExpr, 0, false );
+ INLINE_LIST( ret, csExpr, 0, false );
ret << ")";
}
+ return ret.str();
+}
+
+string JavaTabCodeGen::TOP()
+{
+ ostringstream ret;
+ if ( topExpr == 0 )
+ ret << ACCESS() + "top";
else {
- /* Expression for retrieving the key, use simple dereference. */
- ret << ACCESS() << "cs";
+ ret << "(";
+ INLINE_LIST( ret, topExpr, 0, false );
+ ret << ")";
}
return ret.str();
}
-string JavaTabCodeGen::ACCESS()
+string JavaTabCodeGen::STACK()
{
ostringstream ret;
- if ( accessExpr != 0 )
- INLINE_LIST( ret, accessExpr, 0, false );
+ if ( stackExpr == 0 )
+ ret << ACCESS() + "stack";
+ else {
+ ret << "(";
+ INLINE_LIST( ret, stackExpr, 0, false );
+ ret << ")";
+ }
+ return ret.str();
+}
+
+string JavaTabCodeGen::ACT()
+{
+ ostringstream ret;
+ if ( actExpr == 0 )
+ ret << ACCESS() + "act";
+ else {
+ ret << "(";
+ INLINE_LIST( ret, actExpr, 0, false );
+ ret << ")";
+ }
return ret.str();
}
+string JavaTabCodeGen::TOKSTART()
+{
+ ostringstream ret;
+ if ( tokstartExpr == 0 )
+ ret << ACCESS() + "tokstart";
+ else {
+ ret << "(";
+ INLINE_LIST( ret, tokstartExpr, 0, false );
+ ret << ")";
+ }
+ return ret.str();
+}
+
+string JavaTabCodeGen::TOKEND()
+{
+ ostringstream ret;
+ if ( tokendExpr == 0 )
+ ret << ACCESS() + "tokend";
+ else {
+ ret << "(";
+ INLINE_LIST( ret, tokendExpr, 0, false );
+ ret << ")";
+ }
+ return ret.str();
+}
+
+
string JavaTabCodeGen::GET_WIDE_KEY()
{
if ( redFsm->anyConditions() )
diff --git a/rlgen-java/javacodegen.h b/rlgen-java/javacodegen.h
index 86f67a46..575ce6eb 100644
--- a/rlgen-java/javacodegen.h
+++ b/rlgen-java/javacodegen.h
@@ -123,16 +123,16 @@ public:
string WIDE_ALPH_TYPE();
string ARRAY_TYPE( unsigned long maxVal );
- string P() { return "p"; }
- string PE() { return "pe"; }
-
string ACCESS();
+
+ string P();
+ string PE();
string CS();
- string STACK() { return ACCESS() + "stack"; }
- string TOP() { return ACCESS() + "top"; }
- string TOKSTART() { return ACCESS() + "tokstart"; }
- string TOKEND() { return ACCESS() + "tokend"; }
- string ACT() { return ACCESS() + "act"; }
+ string STACK();
+ string TOP();
+ string TOKSTART();
+ string TOKEND();
+ string ACT();
string DATA_PREFIX();
string PM() { return "_" + DATA_PREFIX() + "partition_map"; }
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() )
diff --git a/rlgen-ruby/rubycodegen.h b/rlgen-ruby/rubycodegen.h
index 773b949b..dc32f68c 100644
--- a/rlgen-ruby/rubycodegen.h
+++ b/rlgen-ruby/rubycodegen.h
@@ -118,16 +118,15 @@ public:
string WIDE_ALPH_TYPE();
string ARRAY_TYPE( unsigned long maxVal );
- string P() { return "p"; }
- string PE() { return "pe"; }
-
string ACCESS();
+ string P();
+ string PE();
string CS();
- string STACK() { return ACCESS() + "stack"; }
- string TOP() { return ACCESS() + "top"; }
- string TOKSTART() { return ACCESS() + "tokstart"; }
- string TOKEND() { return ACCESS() + "tokend"; }
- string ACT() { return ACCESS() + "act"; }
+ string TOP();
+ string STACK();
+ string ACT();
+ string TOKSTART();
+ string TOKEND();
string DATA_PREFIX();
string PM() { return "_" + DATA_PREFIX() + "partition_map"; }