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),
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( )
struct LongestMatch;
typedef DList<LongestMatch> LmList;
+
/* Graph dictionary. */
struct GraphDictEl
:
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 );
/* 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;
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;
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()
{
{
/* 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();
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 );
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),
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;
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;
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;
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 {
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
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
}
+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();
}
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"; }
}
+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() )
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"; }
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" ;
}
}
-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() )
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"; }