void FFlatCodeGen::writeExec()
{
+ testEofUsed = false;
outLabelUsed = false;
out <<
}
if ( hasEnd ) {
- outLabelUsed = true;
+ testEofUsed = true;
out <<
" if ( " << P() << " == " << PE() << " )\n"
- " goto _out;\n";
+ " goto _test_eof;\n";
}
if ( redFsm->errState != 0 ) {
" goto _resume;\n";
}
- if ( outLabelUsed )
- out << " _out: {}\n";
+ if ( testEofUsed )
+ out << " _test_eof: {}\n";
- out << " }\n";
-}
-
-void FFlatCodeGen::writeEOF()
-{
if ( redFsm->anyEofActions() ) {
out <<
+ " if ( " << P() << " == " << EOFV() << " )\n"
" {\n"
" switch ( " << EA() << "[" << CS() << "] ) {\n";
EOF_ACTION_SWITCH();
" }\n"
"\n";
}
+
+ if ( outLabelUsed )
+ out << " _out: {}\n";
+
+ out << " }\n";
+}
+
+void FFlatCodeGen::writeEOF()
+{
}
void FGotoCodeGen::writeExec()
{
+ testEofUsed = false;
outLabelUsed = false;
out << " {\n";
out << " " << WIDE_ALPH_TYPE() << " _widec;\n";
if ( hasEnd ) {
- outLabelUsed = true;
+ testEofUsed = true;
out <<
" if ( " << P() << " == " << PE() << " )\n"
- " goto _out;\n";
+ " goto _test_eof;\n";
}
if ( redFsm->errState != 0 ) {
" goto _resume;\n";
}
+ if ( testEofUsed )
+ out << " _test_eof: {}\n";
- if ( outLabelUsed )
- out << " _out: {}\n";
-
- out << " }\n";
-}
-
-void FGotoCodeGen::writeEOF()
-{
if ( redFsm->anyEofActions() ) {
out <<
+ " if ( " << P() << " == " << EOFV() << " )\n"
" {\n"
" switch ( " << EA() << "[" << CS() << "] ) {\n";
EOF_ACTION_SWITCH();
" }\n"
"\n";
}
+
+ if ( outLabelUsed )
+ out << " _out: {}\n";
+
+ out << " }\n";
+}
+
+void FGotoCodeGen::writeEOF()
+{
}
void FlatCodeGen::writeExec()
{
+ testEofUsed = false;
outLabelUsed = false;
out <<
out << "\n";
if ( hasEnd ) {
- outLabelUsed = true;
+ testEofUsed = true;
out <<
" if ( " << P() << " == " << PE() << " )\n"
- " goto _out;\n";
+ " goto _test_eof;\n";
}
if ( redFsm->errState != 0 ) {
" goto _resume;\n";
}
- if ( outLabelUsed )
- out << " _out: {}\n";
+ if ( testEofUsed )
+ out << " _test_eof: {}\n";
- out << " }\n";
-}
-
-void FlatCodeGen::writeEOF()
-{
if ( redFsm->anyEofActions() ) {
out <<
+ " if ( " << P() << " == " << EOFV() << " )\n"
" {\n"
- " " << PTR_CONST() << ARRAY_TYPE(redFsm->maxActArrItem) << POINTER() << "_acts = " <<
+ " " << PTR_CONST() << ARRAY_TYPE(redFsm->maxActArrItem) << POINTER() << "__acts = " <<
ARR_OFF( A(), EA() + "[" + CS() + "]" ) << ";\n"
- " " << UINT() << " _nacts = " << CAST(UINT()) << " *_acts++;\n"
- " while ( _nacts-- > 0 ) {\n"
- " switch ( *_acts++ ) {\n";
+ " " << UINT() << " __nacts = " << CAST(UINT()) << " *__acts++;\n"
+ " while ( __nacts-- > 0 ) {\n"
+ " switch ( *__acts++ ) {\n";
EOF_ACTION_SWITCH();
SWITCH_DEFAULT() <<
" }\n"
" }\n"
"\n";
}
+
+
+ if ( outLabelUsed )
+ out << " _out: {}\n";
+
+ out << " }\n";
+}
+
+void FlatCodeGen::writeEOF()
+{
}
return ret.str();
}
+string FsmCodeGen::EOFV()
+{
+ ostringstream ret;
+// if ( peExpr == 0 )
+ ret << "eof";
+// else {
+// ret << "(";
+// INLINE_LIST( ret, peExpr, 0, false );
+// ret << ")";
+// }
+ return ret.str();
+}
+
string FsmCodeGen::CS()
{
ostringstream ret;
string P();
string PE();
+ string EOFV();
string ACCESS();
string CS();
unsigned int arrayTypeSize( unsigned long maxVal );
bool outLabelUsed;
+ bool testEofUsed;
bool againLabelUsed;
bool useIndicies;
void FTabCodeGen::writeExec()
{
+ testEofUsed = false;
outLabelUsed = false;
out <<
out << "\n";
if ( hasEnd ) {
- outLabelUsed = true;
+ testEofUsed = true;
out <<
" if ( " << P() << " == " << PE() << " )\n"
- " goto _out;\n";
+ " goto _test_eof;\n";
}
if ( redFsm->errState != 0 ) {
" goto _resume;\n";
}
+ if ( testEofUsed )
+ out << " _test_eof: {}\n";
- if ( outLabelUsed )
- out << " _out: {}\n";
-
- out << " }\n";
-}
-
-
-void FTabCodeGen::writeEOF()
-{
if ( redFsm->anyEofActions() ) {
out <<
+ " if ( " << P() << " == " << EOFV() << " )\n"
" {\n"
" switch ( " << EA() << "[" << CS() << "] ) {\n";
EOF_ACTION_SWITCH();
" }\n"
"\n";
}
+
+ if ( outLabelUsed )
+ out << " _out: {}\n";
+
+ out << " }\n";
+}
+
+
+void FTabCodeGen::writeEOF()
+{
}
void GotoCodeGen::writeExec()
{
+ testEofUsed = false;
outLabelUsed = false;
out << " {\n";
out << "\n";
if ( hasEnd ) {
- outLabelUsed = true;
+ testEofUsed = true;
out <<
" if ( " << P() << " == " << PE() << " )\n"
- " goto _out;\n";
+ " goto _test_eof;\n";
}
if ( redFsm->errState != 0 ) {
" goto _resume;\n";
}
- if ( outLabelUsed )
- out << " _out: {}\n";
-
- out << " }\n";
-}
+ if ( testEofUsed )
+ out << " _test_eof: {}\n";
-void GotoCodeGen::writeEOF()
-{
if ( redFsm->anyEofActions() ) {
out <<
+ " if ( " << P() << " == " << EOFV() << " )\n"
" {\n"
- " " << PTR_CONST() << ARRAY_TYPE(redFsm->maxActArrItem) << POINTER() << "_acts = " <<
+ " " << PTR_CONST() << ARRAY_TYPE(redFsm->maxActArrItem) << POINTER() << "__acts = " <<
ARR_OFF( A(), EA() + "[" + CS() + "]" ) << ";\n"
- " " << UINT() << " _nacts = " << CAST(UINT()) << " *_acts++;\n"
- " while ( _nacts-- > 0 ) {\n"
- " switch ( *_acts++ ) {\n";
+ " " << UINT() << " __nacts = " << CAST(UINT()) << " *__acts++;\n"
+ " while ( __nacts-- > 0 ) {\n"
+ " switch ( *__acts++ ) {\n";
EOF_ACTION_SWITCH();
SWITCH_DEFAULT() <<
" }\n"
" }\n"
"\n";
}
+
+ if ( outLabelUsed )
+ out << " _out: {}\n";
+
+ out << " }\n";
+}
+
+void GotoCodeGen::writeEOF()
+{
}
void IpGotoCodeGen::BREAK( ostream &ret, int targState )
{
- ret << CTRL_FLOW() << "goto _out" << targState << ";";
+ ret << "{" << CS() << " = " << targState << "; " << CTRL_FLOW() << "goto _out;}";
}
bool IpGotoCodeGen::IN_TRANS_ACTIONS( RedStateAp *state )
if ( hasEnd ) {
out <<
" if ( ++" << P() << " == " << PE() << " )\n"
- " goto _out" << state->id << ";\n";
+ " goto _test_eof" << state->id << ";\n";
}
else {
out <<
out << "st" << state->id << ":\n";
/* Break out here. */
- out << " goto _out" << state->id << ";\n";
+ outLabelUsed = true;
+ out << CS() << " = " << state->id << ";\n";
+ out << " goto _out;\n";
}
{
for ( RedStateList::Iter st = redFsm->stateList; st.lte(); st++ ) {
if ( st->outNeeded ) {
- outLabelUsed = true;
- out << " _out" << st->id << ": " << CS() << " = " <<
- st->id << "; goto _out; \n";
+ testEofUsed = true;
+ out << " _test_eof" << st->id << ": " << CS() << " = " <<
+ st->id << "; goto _test_eof; \n";
}
}
return out;
}
if ( hasEnd ) {
- for ( RedStateList::Iter st = redFsm->stateList; st.lte(); st++ )
- st->outNeeded = st->labelNeeded;
- }
- else {
- if ( redFsm->errState != 0 )
- redFsm->errState->outNeeded = true;
-
- for ( TransApSet::Iter trans = redFsm->transSet; trans.lte(); trans++ ) {
- /* Any state with a transition in that has a break will need an
- * out label. */
- if ( trans->action != 0 && trans->action->anyBreakStmt() )
- trans->targ->outNeeded = true;
+ for ( RedStateList::Iter st = redFsm->stateList; st.lte(); st++ ) {
+ if ( st != redFsm->errState )
+ st->outNeeded = st->labelNeeded;
}
}
}
/* Must set labels immediately before writing because we may depend on the
* noend write option. */
setLabelsNeeded();
+ testEofUsed = false;
outLabelUsed = false;
out << " {\n";
out << " " << WIDE_ALPH_TYPE() << " _widec;\n";
if ( hasEnd ) {
- outLabelUsed = true;
+ testEofUsed = true;
out <<
" if ( " << P() << " == " << PE() << " )\n"
- " goto _out;\n";
+ " goto _test_eof;\n";
}
if ( useAgainLabel() ) {
"\n";
if ( hasEnd ) {
- outLabelUsed = true;
+ testEofUsed = true;
out <<
" if ( ++" << P() << " == " << PE() << " )\n"
- " goto _out;\n";
+ " goto _test_eof;\n";
}
else {
out <<
EXIT_STATES() <<
"\n";
- if ( outLabelUsed )
- out << " _out: {}\n";
-
- out <<
- " }\n";
-}
+ if ( testEofUsed )
+ out << " _test_eof: {}\n";
-void IpGotoCodeGen::writeEOF()
-{
if ( redFsm->anyEofActions() ) {
out <<
+ " if ( " << P() << " == " << EOFV() << " )\n"
" {\n"
" switch ( " << CS() << " ) {\n";
FINISH_CASES();
" }\n"
"\n";
}
+
+ if ( outLabelUsed )
+ out << " _out: {}\n";
+
+ out <<
+ " }\n";
+}
+
+void IpGotoCodeGen::writeEOF()
+{
}
void TabCodeGen::writeExec()
{
+ testEofUsed = false;
outLabelUsed = false;
out <<
"\n";
if ( hasEnd ) {
- outLabelUsed = true;
+ testEofUsed = true;
out <<
" if ( " << P() << " == " << PE() << " )\n"
- " goto _out;\n";
+ " goto _test_eof;\n";
}
if ( redFsm->errState != 0 ) {
" goto _resume;\n";
}
- if ( outLabelUsed )
- out << " _out: {}\n";
-
- out << " }\n";
-}
-
-
-void TabCodeGen::writeEOF()
-{
+ if ( testEofUsed )
+ out << " _test_eof: {}\n";
+
if ( redFsm->anyEofActions() ) {
out <<
+ " if ( " << P() << " == " << EOFV() << " )\n"
" {\n"
- " " << PTR_CONST() << ARRAY_TYPE(redFsm->maxActArrItem) << POINTER() << "_acts = " <<
- ARR_OFF( A(), EA() + "[" + CS() + "]" ) << ";\n"
- " " << UINT() << " _nacts = " << CAST(UINT()) << " *_acts++;\n"
- " while ( _nacts-- > 0 ) {\n"
- " switch ( *_acts++ ) {\n";
+ " " << PTR_CONST() << ARRAY_TYPE(redFsm->maxActArrItem) <<
+ POINTER() << "__acts = " << ARR_OFF( A(), EA() + "[" + CS() + "]" ) << ";\n"
+ " " << UINT() << " __nacts = " << CAST(UINT()) << " *__acts++;\n"
+ " while ( __nacts-- > 0 ) {\n"
+ " switch ( *__acts++ ) {\n";
EOF_ACTION_SWITCH();
SWITCH_DEFAULT() <<
" }\n"
" }\n"
"\n";
}
+
+ if ( outLabelUsed )
+ out << " _out: {}\n";
+
+ out << " }\n";
+}
+
+
+void TabCodeGen::writeEOF()
+{
}
{
out <<
" {\n"
+ " boolean testEof = false;\n"
" int _klen";
if ( redFsm->anyRegCurStateRef() )
if ( hasEnd ) {
out <<
- " if ( ++" << P() << " == " << PE() << " )\n"
- " break _resume;\n";
+ " if ( ++" << P() << " == " << PE() << " ) {\n"
+ " testEof = true;\n"
+ " break _resume;\n"
+ " }\n";
}
else {
out <<
out << " }";
/* The if guarding on empty string. */
- if ( hasEnd )
- out << " }\n";
-
- /* The execute block. */
- out << " }\n";
-}
+ if ( hasEnd ) {
+ out <<
+ " }\n"
+ " else"
+ " testEof = true;\n";
+ }
-void JavaTabCodeGen::writeEOF()
-{
if ( redFsm->anyEofActions() ) {
out <<
- " int _acts = " << EA() << "[" << CS() << "]" << ";\n"
- " int _nacts = " << CAST("int") << " " << A() << "[_acts++];\n"
- " while ( _nacts-- > 0 ) {\n"
- " switch ( " << A() << "[_acts++] ) {\n";
+ " if ( testEof && " << P() << " == " << EOFV() << " )\n"
+ " {\n"
+ " int __acts = " << EA() << "[" << CS() << "]" << ";\n"
+ " int __nacts = " << CAST("int") << " " << A() << "[__acts++];\n"
+ " while ( __nacts-- > 0 ) {\n"
+ " switch ( " << A() << "[__acts++] ) {\n";
EOF_ACTION_SWITCH() <<
" }\n"
" }\n"
+ " }\n"
"\n";
}
+
+ /* The execute block. */
+ out << " }\n";
+}
+
+void JavaTabCodeGen::writeEOF()
+{
}
std::ostream &JavaTabCodeGen::OPEN_ARRAY( string type, string name )
return ret.str();
}
+string JavaTabCodeGen::EOFV()
+{
+ ostringstream ret;
+// if ( peExpr == 0 )
+ ret << "eof";
+// else {
+// ret << "(";
+// INLINE_LIST( ret, peExpr, 0, false );
+// ret << ")";
+// }
+ return ret.str();
+}
+
string JavaTabCodeGen::CS()
{
ostringstream ret;
string P();
string PE();
+ string EOFV();
+
string CS();
string STACK();
string TOP();
return ret.str();
}
+string RubyCodeGen::EOFV()
+{
+ ostringstream ret;
+// if ( peExpr == 0 )
+ ret << "eof";
+// else {
+// //ret << "(";
+// INLINE_LIST( ret, peExpr, 0, false );
+// //ret << ")";
+// }
+ return ret.str();
+}
+
string RubyCodeGen::CS()
{
ostringstream ret;
string P();
string PE();
+ string EOFV();
+
string CS();
string TOP();
string STACK();
{
out <<
"begin # ragel fflat\n"
+ " testEof = false\n"
" _slen, _trans, _keys, _inds";
if ( redFsm->anyRegCurStateRef() )
out << ", _ps";
out << " " << P() << " += 1\n";
- if ( hasEnd )
- out << " break if " << P() << " == " << PE() << "\n";
-
+ if ( hasEnd ) {
+ out <<
+ " if " << P() << " == " << PE() << "\n"
+ " testEof = true\n"
+ " break\n"
+ " end\n";
+ }
out << /* Close the _resume loop. */
" end # _resume loop\n";
out << " end # errstate guard\n";
- if ( hasEnd )
- out << " end # pe guard\n";
-
- out << "end # ragel fflat";
-
-}
-
+ if ( hasEnd ) {
+ out <<
+ " # close if guarding empty string \n"
+ " else\n"
+ " testEof = true\n"
+ " end\n";
+ }
-void RubyFFlatCodeGen::writeEOF()
-{
if ( redFsm->anyEofActions() ) {
out <<
+ " if testEof && " << P() << " == " << EOFV() << "\n"
" case " << EA() << "[" << CS() << "]\n";
EOF_ACTION_SWITCH();
out <<
" end # eof action switch \n"
+ " end\n"
"\n";
}
+
+ out << "end # ragel fflat";
}
+void RubyFFlatCodeGen::writeEOF()
+{
+}
+
/*
* Local Variables:
* mode: c++
void RubyFlatCodeGen::writeEOF()
{
- if ( redFsm->anyEofActions() ) {
- out <<
- " begin\n"
- " " << "_acts = " << EA() << "[" << CS() << "]\n"
- " _nacts = " << A() << "[_acts]\n" <<
- " _acts += 1\n"
- " while ( _nacts > 0 ) \n"
- " _nacts -= 1\n"
- " _acts += 1\n"
- " case ( "<< A() << "[_acts-1] ) \n";
- EOF_ACTION_SWITCH();
- out <<
- " end # eof action switch \n"
- " end\n"
- " end\n"
- "\n";
- }
}
void RubyFlatCodeGen::writeExec()
{
out <<
"begin # ragel flat\n"
+ " testEof = false\n"
" _slen, _trans, _keys, _inds";
if ( redFsm->anyRegCurStateRef() )
out << ", _ps";
out << " " << P() << " += 1\n";
- if ( hasEnd )
- out << " break if " << P() << " == " << PE() << "\n";
-
+ if ( hasEnd ) {
+ out <<
+ " if " << P() << " == " << PE() << "\n"
+ " testEof = true\n"
+ " break\n"
+ " end\n";
+ }
out << /* Close the _resume loop. */
" end # _resume loop\n";
out << " end # errstate guard\n";
- if ( hasEnd )
- out << " end # pe guard\n";
+ if ( hasEnd ) {
+ out <<
+ " # close if guarding empty string \n"
+ " else\n"
+ " testEof = true\n"
+ " end\n";
+ }
+
+ if ( redFsm->anyEofActions() ) {
+ out <<
+ " if testEof && " << P() << " == " << EOFV() << "\n"
+ " begin\n"
+ " __acts = " << EA() << "[" << CS() << "]\n"
+ " __nacts = " << A() << "[__acts]\n" <<
+ " __acts += 1\n"
+ " while ( __nacts > 0 ) \n"
+ " __nacts -= 1\n"
+ " __acts += 1\n"
+ " case ( "<< A() << "[__acts-1] ) \n";
+ EOF_ACTION_SWITCH();
+ out <<
+ " end # eof action switch \n"
+ " end\n"
+ " end\n"
+ " end\n"
+ "\n";
+ }
out << "end # ragel flat";
}
void RubyFTabCodeGen::writeEOF()
{
- if ( redFsm->anyEofActions() ) {
- out <<
- " begin\n"
- " case ( " << EA() << "[" << CS() << "] )\n";
- EOF_ACTION_SWITCH();
- out <<
- " end\n"
- " end\n"
- "\n";
- }
}
void RubyFTabCodeGen::writeExec()
{
out <<
- " begin # ragel ftab \n"
- " _klen, _trans, _keys";
+ "begin # ragel ftab\n"
+ " testEof = false\n"
+ " _klen, _trans, _keys";
if ( redFsm->anyRegCurStateRef() )
out << ", _ps";
if ( hasEnd ) {
out <<
- " break if "<< P() << " == " << PE() << " \n";
+ " if " << P() << " == " << PE() << "\n"
+ " testEof = true\n"
+ " break\n"
+ " end\n";
}
/* Close the resume loop. */
out << " end # close if guarding error state \n";
/* The if guarding on empty string. */
- if ( hasEnd )
- out << " end # close if guarding empty string \n";
+ if ( hasEnd ) {
+ out <<
+ " # close if guarding empty string \n"
+ " else\n"
+ " testEof = true\n"
+ " end\n";
+ }
+
+ if ( redFsm->anyEofActions() ) {
+ out <<
+ " if testEof && " << P() << " == " << EOFV() << "\n"
+ " begin\n"
+ " case ( " << EA() << "[" << CS() << "] )\n";
+ EOF_ACTION_SWITCH();
+ out <<
+ " end\n"
+ " end\n"
+ " end\n"
+ "\n";
+ }
/* Wrapping the execute block. */
out << " end # close execution block \n";
void RubyTabCodeGen::writeExec()
{
- out << "begin\n"
- << " _klen, _trans, _keys";
+ out <<
+ "begin\n"
+ " testEof = false\n"
+ " _klen, _trans, _keys";
if ( redFsm->anyRegCurStateRef() )
out << ", _ps";
out << " " << P() << " += 1\n";
- if ( hasEnd )
- out << " break if " << P() << " == " << PE() << "\n";
+ if ( hasEnd ) {
+ out <<
+ " if " << P() << " == " << PE() << "\n"
+ " testEof = true\n"
+ " break\n"
+ " end\n";
+ }
/* Close the resume loop. */
out << " end\n";
out << " end\n";
/* The if guarding on empty string. */
- if ( hasEnd )
- out << " end\n";
-
- /* Wrapping the execute block. */
- out << " end\n";
-}
+ if ( hasEnd ) {
+ out <<
+ " else\n"
+ " testEof = true\n"
+ " end\n";
+ }
-void RubyTabCodeGen::writeEOF()
-{
if ( redFsm->anyEofActions() ) {
out <<
- " _acts = " << EA() << "[" << CS() << "]\n"
- " _nacts = " << " " << A() << "[_acts]\n"
- " _acts += 1\n"
- " while _nacts > 0\n"
- " _nacts -= 1\n"
- " _acts += 1\n"
- " case " << A() << "[_acts - 1]\n";
+ " if testEof && " << P() << " == " << EOFV() << "\n"
+ " __acts = " << EA() << "[" << CS() << "]\n"
+ " __nacts = " << " " << A() << "[__acts]\n"
+ " __acts += 1\n"
+ " while __nacts > 0\n"
+ " __nacts -= 1\n"
+ " __acts += 1\n"
+ " case " << A() << "[__acts - 1]\n";
EOF_ACTION_SWITCH() <<
" end # eof action switch\n"
+ " end\n"
" end\n";
}
+
+ /* Wrapping the execute block. */
+ out << " end\n";
+}
+
+void RubyTabCodeGen::writeEOF()
+{
}
--- /dev/null
+include "testcase.txl"
+
+define program
+ [lang_indep]
+ | 'yes
+ | 'no
+end define
+
+rule findEof1
+ match [machine_expr_item]
+ '>/
+end rule
+
+rule findEof2
+ match [machine_expr_item]
+ '</
+end rule
+
+rule findEof3
+ match [machine_expr_item]
+ '$/
+end rule
+
+rule findEof4
+ match [machine_expr_item]
+ '%/
+end rule
+
+rule findEof5
+ match [machine_expr_item]
+ '@/
+end rule
+
+rule findEof6
+ match [machine_expr_item]
+ '<>/
+end rule
+
+rule findEof7
+ match [repeat machine_expr_item]
+ '> 'eof _ [repeat machine_expr_item]
+end rule
+
+rule findEof8
+ match [repeat machine_expr_item]
+ '< 'eof _ [repeat machine_expr_item]
+end rule
+
+rule findEof9
+ match [repeat machine_expr_item]
+ '$ 'eof _ [repeat machine_expr_item]
+end rule
+
+rule findEof10
+ match [repeat machine_expr_item]
+ '% 'eof _ [repeat machine_expr_item]
+end rule
+
+rule findEof11
+ match [repeat machine_expr_item]
+ '@ 'eof _ [repeat machine_expr_item]
+end rule
+
+rule findEof12
+ match [repeat machine_expr_item]
+ '<> 'eof _ [repeat machine_expr_item]
+end rule
+
+function findEof P [program]
+ replace [program]
+ _ [program]
+ where
+ P
+ [findEof1] [findEof2] [findEof3]
+ [findEof4] [findEof5] [findEof6]
+ [findEof7] [findEof8] [findEof9]
+ [findEof10] [findEof11] [findEof12]
+ by
+ 'yes
+end function
+
+function main
+ replace [program]
+ P [program]
+ construct NewP [program]
+ 'no
+ by
+ NewP [findEof P]
+end function
return 0;
}
-int Fsm::execute( LangEl *_data, int _len )
+int Fsm::execute( LangEl *data, int len )
{
- LangEl *p = _data;
- LangEl *pe = _data+_len;
+ LangEl *p = data;
+ LangEl *pe = data + len;
+ LangEl *eof = pe;
%% write exec;
if ( cs == Fsm_error )
int Fsm::finish( )
{
- %% write eof;
-
if ( cs == Fsm_error )
return -1;
if ( cs >= Fsm_first_final )
{
struct LangEl *p = _data;
struct LangEl *pe = _data+_len;
+ struct LangEl *eof = pe;
%% write exec;
}
int fsm_finish( struct fsm *fsm )
{
- %% write eof;
-
if ( fsm->cs == fsm_error )
return -1;
if ( fsm->cs >= fsm_first_final )
{
struct LangEl *p = _data;
struct LangEl *pe = _data + _len;
+ struct LangEl *eof = pe;
%% write exec;
if ( self->cs == Fsm_error )
- (int) finish;
{
- %% write eof;
if ( self->cs == Fsm_error )
return -1;
return ( self->cs >= Fsm_first_final ) ? 1 : 0;
{
const char *p = _data;
const char *pe = _data+_len;
+ const char *eof = pe;
%% write exec;
}
int erract_finish( struct erract *fsm )
{
- %% write eof;
-
if ( fsm->cs == erract_error )
return -1;
else if ( fsm->cs >= erract_first_final )
{
const char *p = _data;
const char *pe = _data + _len;
+ const char *eof = pe;
%% write exec;
}
- (int) finish;
{
- %% write eof;
if ( cs == ErrAct_error )
return -1;
else if ( cs >= ErrAct_first_final )
{
const char *p = _data;
const char *pe = _data+_len;
+ const char *eof = pe;
%% write exec;
}
int tokenizer_finish( struct tokenizer *fsm )
{
- %% write eof;
-
if ( fsm->cs == tokenizer_error )
return -1;
if ( fsm->cs >= tokenizer_first_final )
# Make a temporary version of the test case using the C language translations.
sed -n '/\/\*/,/\*\//d;p' $file | txl -q stdin langtrans_c.txl > $file.pr
+has_eof_act=`sed -n '/\/\*/,/\*\//d;p' $file | txl -q stdin checkeofact.txl`
+
# Begin writing out the test case.
cat << EOF
/*
{
char *p = data;
char *pe = data + len;
+EOF
+
+[ "$has_eof_act" = "yes" ] && echo "char *eof = pe;"
+
+cat << EOF
%% write exec;
}
void finish( )
{
- %% write eof;
if ( cs >= ${machine}_first_final )
printf( "ACCEPT\\n" );
else
{
char *p = data.ptr;
char *pe = data.ptr + data.length;
+ char *eof = pe;
char _s[];
%% write exec;
void finish( )
{
- %% write eof;
if ( cs >= ${machine}_first_final )
writefln( "ACCEPT" );
else
{
int p = 0;
int pe = len;
+ int eof = len;
String _s;
%% write exec;
}
void finish( )
{
- %% write eof;
if ( cs >= ${class}_first_final )
System.out.println( "ACCEPT" );
else
def run_machine( data )
p = 0
pe = data.length
+ eof = data.length
cs = 0;
EOF
%% write init;
%% write exec;
- %% write eof;
if cs >= ${machine}_first_final
puts "ACCEPT"
else
[ -z "$allow_minflags" ] && allow_minflags="-n -m -l -e"
case $lang in
- c|c++|objc|d)
+ c|obj-c|c++|d)
# Using genflags, get the allowed gen flags from the test case. If the
# test case doesn't specify assume that all gen flags are allowed.
allow_genflags=`sed '/@ALLOW_GENFLAGS:/s/^.*: *//p;d' $test_case`
define al_term_base
[id]
+ | [SPOFF] [id] '( [SPON] [al_expr] ')
| [opt al_sign] [number]
| [stringlit]
| [charlit]