If the main machine is not present then do not emit an error. Generate the
authorthurston <thurston@052ea7fc-9027-0410-9066-f65837a77df0>
Mon, 12 Mar 2007 20:58:18 +0000 (20:58 +0000)
committerthurston <thurston@052ea7fc-9027-0410-9066-f65837a77df0>
Mon, 12 Mar 2007 20:58:18 +0000 (20:58 +0000)
machine without a start state and do not initialize cs in the write init code.

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

13 files changed:
ragel/main.cpp
ragel/parsedata.cpp
ragel/ragel.h
ragel/rlparse.kl
ragel/xmlcodegen.cpp
redfsm/gendata.cpp
redfsm/redfsm.cpp
rlgen-cd/fsmcodegen.cpp
rlgen-java/javacodegen.cpp
rlgen-ruby/rubycodegen.cpp
test/export1.rl
test/export2.rl
test/export3.rl

index aacccc9..1cb43d6 100644 (file)
@@ -313,8 +313,6 @@ int main(int argc, char **argv)
        if ( machineSpec == 0 && machineName == 0 )
                outputBuffer << "</host>\n";
 
-       checkMachines();
-
        if ( gblErrorCount > 0 )
                return 1;
        
index 4550fb3..dd44218 100644 (file)
@@ -34,7 +34,7 @@
 
 using namespace std;
 
-char machineMain[] = "main";
+char mainMachine[] = "main";
 
 void Token::set( char *str, int len )
 {
@@ -1151,7 +1151,7 @@ FsmAp *ParseData::makeAll()
        /* Make all the instantiations, we know that main exists in this list. */
        initNameWalk();
        for ( GraphList::Iter glel = instanceList; glel.lte();  glel++ ) {
-               if ( strcmp( glel->key, machineMain ) == 0 ) {
+               if ( strcmp( glel->key, mainMachine ) == 0 ) {
                        /* Main graph is always instantiated. */
                        mainGraph = makeInstance( glel );
                }
@@ -1161,6 +1161,9 @@ FsmAp *ParseData::makeAll()
                }
        }
 
+       if ( mainGraph == 0 )
+               mainGraph = graphs[--numOthers];
+
        if ( numOthers > 0 ) {
                /* Add all the other graphs into main. */
                mainGraph->globOp( graphs, numOthers );
@@ -1420,22 +1423,6 @@ void terminateAllParsers( )
                pdel->value->token( loc, _eof, 0, 0 );
 }
 
-void checkMachines( )
-{
-       for ( ParserDict::Iter parser = parserDict; parser.lte(); parser++ ) {
-               ParseData *pd = parser->value->pd;
-               if ( pd->instanceList.length() > 0 ) {
-                       /* There must be a main graph defined. */
-                       /* No machine name. Need to have a main. Make sure it was given. */
-                       GraphDictEl *mainEl = pd->graphDict.find( machineMain );
-                       if ( mainEl == 0 ) {
-                               error(pd->sectionLoc) << "main graph not defined in \"" << 
-                                               pd->sectionName << "\"" << endl;
-                       }
-               }
-       }
-}
-
 void writeLanguage( std::ostream &out )
 {
        out << " lang=\"";
index d070217..3a6ee81 100644 (file)
@@ -52,7 +52,7 @@ extern char *machineSpec, *machineName;
 extern bool printStatistics;
 
 extern int gblErrorCount;
-extern char machineMain[];
+extern char mainMachine[];
 
 /* Location in an input file. */
 struct InputLoc
@@ -69,7 +69,6 @@ std::ostream &warning( const InputLoc &loc );
 
 void scan( char *fileName, std::istream &input, std::ostream &output );
 void terminateAllParsers( );
-void checkMachines( );
 void writeMachines( std::ostream &out, std::string hostData, char *inputFileName );
 void xmlEscapeHost( std::ostream &out, char *data, int len );
 
index a6889a9..3257286 100644 (file)
@@ -77,7 +77,7 @@ assignment:
        opt_export machine_name '=' join ';' final {
                /* Main machine must be an instance. */
                bool isInstance = false;
-               if ( strcmp($2->token.data, machineMain) == 0 ) {
+               if ( strcmp($2->token.data, mainMachine) == 0 ) {
                        warning($2->token.loc) << 
                                        "main machine will be implicitly instantiated" << endl;
                        isInstance = true;
index 0c315f3..021c97e 100644 (file)
@@ -610,8 +610,11 @@ void XMLCodeGen::writeMachine()
        writeConditions();
 
        /* Start state. */
-       out << "    <start_state>" << fsm->startState->alg.stateNum << 
-               "</start_state>\n";
+       GraphDictEl *mainEl = pd->graphDict.find( mainMachine );
+       if ( mainEl != 0 ) {
+               out << "    <start_state>" << fsm->startState->alg.stateNum << 
+                       "</start_state>\n";
+       }
        
        /* Error state. */
        if ( fsm->errState != 0 ) {
index 7a8d19c..b0893cc 100644 (file)
@@ -86,8 +86,8 @@ void CodeGenData::initStateList( unsigned long length )
                redFsm->stateList.append( allStates+s );
 
        /* We get the start state as an offset, set the pointer now. */
-       assert( startState >= 0 );
-       redFsm->startState = allStates + startState;
+       if ( startState >= 0 )
+               redFsm->startState = allStates + startState;
        if ( errState >= 0 )
                redFsm->errState = allStates + errState;
        for ( EntryIdVect::Iter en = entryPointIds; en.lte(); en++ )
index 797d7a4..6a55b22 100644 (file)
@@ -45,6 +45,7 @@ RedFsmAp::RedFsmAp()
        forcedErrorState(false),
        nextActionId(0),
        nextTransId(0),
+       startState(0),
        errState(0),
        errTrans(0),
        firstFinState(0),
@@ -106,7 +107,8 @@ void RedFsmAp::depthFirstOrdering()
 
        /* Add back to the state list from the start state and all other entry
         * points. */
-       depthFirstOrdering( startState );
+       if ( startState != 0 )
+               depthFirstOrdering( startState );
        for ( RedStateSet::Iter en = entryPoints; en.lte(); en++ )
                depthFirstOrdering( *en );
        if ( forcedErrorState )
index 33b1efa..3e277f4 100644 (file)
@@ -457,7 +457,9 @@ string FsmCodeGen::FIRST_FINAL_STATE()
 void FsmCodeGen::writeInit()
 {
        out << "        {\n";
-       out << "\t" << CS() << " = " << START() << ";\n";
+
+       if ( redFsm->startState != 0 )
+               out << "\t" << CS() << " = " << START() << ";\n";
        
        /* If there are any calls, then the stack top needs initialization. */
        if ( redFsm->anyActionCalls() || redFsm->anyActionRets() )
@@ -512,7 +514,8 @@ string FsmCodeGen::WIDE_ALPH_TYPE()
 
 void FsmCodeGen::STATE_IDS()
 {
-       STATIC_VAR( "int", START() ) << " = " << START_STATE_ID() << ";\n";
+       if ( redFsm->startState != 0 )
+               STATIC_VAR( "int", START() ) << " = " << START_STATE_ID() << ";\n";
 
        if ( writeFirstFinal )
                STATIC_VAR( "int" , FIRST_FINAL() ) << " = " << FIRST_FINAL_STATE() << ";\n";
index acfe436..731057a 100644 (file)
@@ -890,7 +890,8 @@ void JavaTabCodeGen::writeData()
                "\n";
        }
 
-       STATIC_VAR( "int", START() ) << " = " << START_STATE_ID() << ";\n";
+       if ( redFsm->startState != 0 )
+               STATIC_VAR( "int", START() ) << " = " << START_STATE_ID() << ";\n";
 
        if ( writeFirstFinal )
                STATIC_VAR( "int" , FIRST_FINAL() ) << " = " << FIRST_FINAL_STATE() << ";\n";
@@ -1383,7 +1384,9 @@ string JavaTabCodeGen::FIRST_FINAL_STATE()
 void JavaTabCodeGen::writeInit()
 {
        out << "        {\n";
-       out << "\t" << CS() << " = " << START() << ";\n";
+
+       if ( redFsm->startState != 0 )
+               out << "\t" << CS() << " = " << START() << ";\n";
        
        /* If there are any calls, then the stack top needs initialization. */
        if ( redFsm->anyActionCalls() || redFsm->anyActionRets() )
index 0fe2c9a..180ca0c 100644 (file)
@@ -382,8 +382,10 @@ std::ostream &RubyCodeGen::ACTION_SWITCH()
 
 void RubyCodeGen::writeInit()
 {
-       out << INDENT_U() << "begin"
-               << INDENT_S() <<   CS() << " = " << START();
+       out << INDENT_U() << "begin";
+
+       if ( redFsm->startState != 0 )
+               out << INDENT_S() <<   CS() << " = " << START();
 
        /* If there are any calls, then the stack top needs initialization. */
        if ( redFsm->anyActionCalls() || redFsm->anyActionRets() )
@@ -1144,7 +1146,8 @@ void RubyCodeGen::writeData()
                "\n";
        }
 
-       STATIC_VAR( "int", START() ) << " = " << START_STATE_ID() << ";\n";
+       if ( redFsm->startState != 0 )
+               STATIC_VAR( "int", START() ) << " = " << START_STATE_ID() << ";\n";
 
        if ( writeFirstFinal )
                STATIC_VAR( "int" , FIRST_FINAL() ) << " = " << FIRST_FINAL_STATE() << ";\n";
index 1fec2e7..37e2974 100644 (file)
@@ -18,7 +18,7 @@
                c3 . '.'* '\n' @{ printf( "c3\n" );}
        )*;
                
-       main := any*;
+       some_other := any*;
 }%%
 
 %% write exports;
 
 int test( const char *data, int len )
 {
-       int cs;
+       int cs = test_en_commands;
        const char *p = data, *pe = data + len;
 
-       cs = test_en_commands;
+       %% write init;
        %% write exec;
 
        if ( cs >= test_first_final )
index 3eef0dd..ac4100c 100644 (file)
@@ -18,7 +18,7 @@ class export2
                        c3 . '.'* '\n' @{ System.out.println( "c3" );}
                )*;
                        
-               main := any*;
+               other := any*;
        }%%
 
        %% write exports;
@@ -26,10 +26,10 @@ class export2
 
        static void test( char data[] )
        {
-               int cs, p = 0, pe = data.length;
+               int cs = test_en_commands, p = 0, pe = data.length;
                int top;
 
-               cs = test_en_commands;
+               %% write init;
                %% write exec;
 
                if ( cs >= test_first_final )
index 39603d6..a0f7190 100644 (file)
@@ -16,7 +16,7 @@
                c3 . '.'* '\n' @{ puts "c3"; }
        )*;
                        
-       main := any*;
+       other := any*;
 }%%
 
 %% write exports;
 def run_machine( data )
        p = 0;
        pe = data.length
-       cs = 0
-       cs = 0
+       cs = test_en_commands
        val = 0;
        neg = false;
 
-       cs = test_en_commands;
        %% write exec;
        %% write eof;
        if  cs >= test_first_final