From: thurston Date: Thu, 14 Jun 2007 03:46:41 +0000 (+0000) Subject: The "data" variable can now be overridden using the variable statement. This is X-Git-Tag: 2.0_alpha~278 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a708bd8671b2f38980eaa329dc09523da32d0844;p=external%2Fragel.git The "data" variable can now be overridden using the variable statement. This is applicable in Ruby and Java code only. git-svn-id: http://svn.complang.org/ragel/trunk@243 052ea7fc-9027-0410-9066-f65837a77df0 --- diff --git a/ragel/parsedata.cpp b/ragel/parsedata.cpp index 0fe69f7..f8e1747 100644 --- a/ragel/parsedata.cpp +++ b/ragel/parsedata.cpp @@ -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; diff --git a/ragel/parsedata.h b/ragel/parsedata.h index 0def9ad..ad90ccd 100644 --- a/ragel/parsedata.h +++ b/ragel/parsedata.h @@ -268,6 +268,7 @@ struct ParseData InlineList *actExpr; InlineList *tokstartExpr; InlineList *tokendExpr; + InlineList *dataExpr; /* The alphabet range. */ char *lowerNum, *upperNum; diff --git a/ragel/xmlcodegen.cpp b/ragel/xmlcodegen.cpp index dd36167..54e4a2b 100644 --- a/ragel/xmlcodegen.cpp +++ b/ragel/xmlcodegen.cpp @@ -672,6 +672,12 @@ void XMLCodeGen::writeXML() out << "\n"; } + if ( pd->dataExpr != 0 ) { + out << " "; + writeInlineList( pd->dataExpr ); + out << "\n"; + } + writeExports(); writeMachine(); diff --git a/redfsm/gendata.h b/redfsm/gendata.h index ee450a2..d1ea1ec 100644 --- a/redfsm/gendata.h +++ b/redfsm/gendata.h @@ -111,6 +111,7 @@ struct CodeGenData InlineList *actExpr; InlineList *tokstartExpr; InlineList *tokendExpr; + InlineList *dataExpr; KeyOps thisKeyOps; bool wantComplete; diff --git a/redfsm/xmlparse.kh b/redfsm/xmlparse.kh index 2e29db5..12424c4 100644 --- a/redfsm/xmlparse.kh +++ b/redfsm/xmlparse.kh @@ -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; diff --git a/redfsm/xmlparse.kl b/redfsm/xmlparse.kl index 3f4d926..5149171 100644 --- a/redfsm/xmlparse.kl +++ b/redfsm/xmlparse.kl @@ -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 diff --git a/redfsm/xmltags.gperf b/redfsm/xmltags.gperf index 85ad4be..4a5b840 100644 --- a/redfsm/xmltags.gperf +++ b/redfsm/xmltags.gperf @@ -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 diff --git a/rlgen-java/javacodegen.cpp b/rlgen-java/javacodegen.cpp index 8dc4dca..e288d32 100644 --- a/rlgen-java/javacodegen.cpp +++ b/rlgen-java/javacodegen.cpp @@ -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() { diff --git a/rlgen-java/javacodegen.h b/rlgen-java/javacodegen.h index 575ce6e..c63c907 100644 --- a/rlgen-java/javacodegen.h +++ b/rlgen-java/javacodegen.h @@ -133,6 +133,7 @@ public: string TOKSTART(); string TOKEND(); string ACT(); + string DATA(); string DATA_PREFIX(); string PM() { return "_" + DATA_PREFIX() + "partition_map"; } diff --git a/rlgen-ruby/rubycodegen.cpp b/rlgen-ruby/rubycodegen.cpp index e91e63f..c1928bb 100644 --- a/rlgen-ruby/rubycodegen.cpp +++ b/rlgen-ruby/rubycodegen.cpp @@ -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() { diff --git a/rlgen-ruby/rubycodegen.h b/rlgen-ruby/rubycodegen.h index dc32f68..f096e43 100644 --- a/rlgen-ruby/rubycodegen.h +++ b/rlgen-ruby/rubycodegen.h @@ -127,6 +127,7 @@ public: string ACT(); string TOKSTART(); string TOKEND(); + string DATA(); string DATA_PREFIX(); string PM() { return "_" + DATA_PREFIX() + "partition_map"; }