The "data" variable can now be overridden using the variable statement. This is
authorthurston <thurston@052ea7fc-9027-0410-9066-f65837a77df0>
Thu, 14 Jun 2007 03:46:41 +0000 (03:46 +0000)
committerthurston <thurston@052ea7fc-9027-0410-9066-f65837a77df0>
Thu, 14 Jun 2007 03:46:41 +0000 (03:46 +0000)
applicable in Ruby and Java code only.

git-svn-id: http://svn.complang.org/ragel/trunk@243 052ea7fc-9027-0410-9066-f65837a77df0

ragel/parsedata.cpp
ragel/parsedata.h
ragel/xmlcodegen.cpp
redfsm/gendata.h
redfsm/xmlparse.kh
redfsm/xmlparse.kl
redfsm/xmltags.gperf
rlgen-java/javacodegen.cpp
rlgen-java/javacodegen.h
rlgen-ruby/rubycodegen.cpp
rlgen-ruby/rubycodegen.h

index 0fe69f7..f8e1747 100644 (file)
@@ -437,6 +437,7 @@ ParseData::ParseData( char *fileName, char *sectionName,
        actExpr(0),
        tokstartExpr(0),
        tokendExpr(0),
+       dataExpr(0),
        lowerNum(0),
        upperNum(0),
        fileName(fileName),
@@ -883,6 +884,8 @@ bool ParseData::setVariable( char *var, InlineList *inlineList )
                tokstartExpr = inlineList;
        else if ( strcmp( var, "tokend" ) == 0 )
                tokendExpr = inlineList;
+       else if ( strcmp( var, "data" ) == 0 )
+               dataExpr = inlineList;
        else
                set = false;
 
index 0def9ad..ad90ccd 100644 (file)
@@ -268,6 +268,7 @@ struct ParseData
        InlineList *actExpr;
        InlineList *tokstartExpr;
        InlineList *tokendExpr;
+       InlineList *dataExpr;
 
        /* The alphabet range. */
        char *lowerNum, *upperNum;
index dd36167..54e4a2b 100644 (file)
@@ -672,6 +672,12 @@ void XMLCodeGen::writeXML()
                out << "</tokend_expr>\n";
        }
        
+       if ( pd->dataExpr != 0 ) {
+               out << "  <data_expr>";
+               writeInlineList( pd->dataExpr );
+               out << "</data_expr>\n";
+       }
+       
        writeExports();
        
        writeMachine();
index ee450a2..d1ea1ec 100644 (file)
@@ -111,6 +111,7 @@ struct CodeGenData
        InlineList *actExpr;
        InlineList *tokstartExpr;
        InlineList *tokendExpr;
+       InlineList *dataExpr;
 
        KeyOps thisKeyOps;
        bool wantComplete;
index 2e29db5..12424c4 100644 (file)
@@ -116,7 +116,8 @@ struct Parser
                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;
+                       TAG_stack_expr, TAG_act_expr, TAG_tokstart_expr, TAG_tokend_expr,
+                       TAG_data_expr;
        }%%
 
        %% write instance_data;
index 3f4d926..5149171 100644 (file)
@@ -169,6 +169,7 @@ ragel_def_item: tag_stack_expr;
 ragel_def_item: tag_act_expr;
 ragel_def_item: tag_tokstart_expr;
 ragel_def_item: tag_tokend_expr;
+ragel_def_item: tag_data_expr;
 
 tag_export_list: TAG_exports export_list '/' TAG_exports;
 
@@ -219,6 +220,8 @@ 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_data_expr: TAG_data_expr inline_list '/' TAG_data_expr
+       final { cgd->dataExpr = $2->inlineList; };
 
 
 tag_write: tag_write_head write_option_list '/' TAG_write
index 85ad4be..4a5b840 100644 (file)
@@ -87,3 +87,4 @@ stack_expr, TAG_stack_expr
 act_expr, TAG_act_expr
 tokstart_expr, TAG_tokstart_expr
 tokend_expr, TAG_tokend_expr
+data_expr, TAG_data_expr
index 8dc4dca..e288d32 100644 (file)
@@ -1126,7 +1126,7 @@ string JavaTabCodeGen::GET_KEY()
        }
        else {
                /* Expression for retrieving the key, use simple dereference. */
-               ret << "data[" << P() << "]";
+               ret << DATA() << "[" << P() << "]";
        }
        return ret.str();
 }
@@ -1301,6 +1301,19 @@ string JavaTabCodeGen::TOKEND()
        return ret.str();
 }
 
+string JavaTabCodeGen::DATA()
+{
+       ostringstream ret;
+       if ( dataExpr == 0 )
+               ret << ACCESS() + "data";
+       else {
+               ret << "(";
+               INLINE_LIST( ret, dataExpr, 0, false );
+               ret << ")";
+       }
+       return ret.str();
+}
+
 
 string JavaTabCodeGen::GET_WIDE_KEY()
 {
index 575ce6e..c63c907 100644 (file)
@@ -133,6 +133,7 @@ public:
        string TOKSTART();
        string TOKEND();
        string ACT();
+       string DATA();
 
        string DATA_PREFIX();
        string PM() { return "_" + DATA_PREFIX() + "partition_map"; }
index e91e63f..c1928bb 100644 (file)
@@ -448,7 +448,7 @@ string RubyCodeGen::GET_KEY()
        }
        else {
                /* Expression for retrieving the key, use simple dereference. */
-               ret << "data[" << P() << "]";
+               ret << DATA() << "[" << P() << "]";
        }
        return ret.str();
 }
@@ -1343,6 +1343,19 @@ string RubyCodeGen::TOKEND()
        return ret.str();
 }
 
+string RubyCodeGen::DATA()
+{
+       ostringstream ret;
+       if ( dataExpr == 0 )
+               ret << ACCESS() + "data";
+       else {
+               //ret << "(";
+               INLINE_LIST( ret, dataExpr, 0, false );
+               //ret << ")";
+       }
+       return ret.str();
+}
+
 
 string RubyCodeGen::GET_WIDE_KEY()
 {
index dc32f68..f096e43 100644 (file)
@@ -127,6 +127,7 @@ public:
        string ACT();
        string TOKSTART();
        string TOKEND();
+       string DATA();
 
        string DATA_PREFIX();
        string PM() { return "_" + DATA_PREFIX() + "partition_map"; }