/*
- * Copyright 2001-2007 Adrian Thurston <thurston@cs.queensu.ca>
+ * Copyright 2001-2007 Adrian Thurston <thurston@complang.org>
*/
/* This file is part of Ragel.
#include "version.h"
#include "common.h"
#include "xmlparse.h"
+#include "inputdata.h"
using std::istream;
using std::ostream;
" -x Run the frontend only: emit XML intermediate format\n"
" -V Generate a dot file for Graphviz\n"
" -p Display printable characters on labels\n"
-" -S <spec> FSM specification to output (for rlgen-dot)\n"
-" -M <machine> Machine definition/instantiation to output (for rlgen-dot)\n"
+" -S <spec> FSM specification to output (for graphviz output)\n"
+" -M <machine> Machine definition/instantiation to output (for graphviz output)\n"
"host language:\n"
" -C The host language is C, C++, Obj-C or Obj-C++ (default)\n"
" -D The host language is D\n"
}
}
-void process( const char *inputFileName, const char *intermed )
+void process( const char *inputFileName )
{
- const char *xmlFileName = intermed;
bool wantComplete = true;
bool outputActive = true;
/* Used for just a few things. */
std::ostringstream hostData;
- if ( machineSpec == 0 && machineName == 0 )
- hostData << "<host line=\"1\" col=\"1\">";
+ /* Make the first input item. */
+ InputItem *firstInputItem = new InputItem;
+ firstInputItem->type = InputItem::HostData;
+ firstInputItem->loc.line = 1;
+ firstInputItem->loc.col = 1;
+ inputItems.append( firstInputItem );
- Scanner scanner( inputFileName, *inFile, hostData, 0, 0, 0, false );
+ Scanner scanner( inputFileName, *inFile, 0, 0, 0, false );
scanner.do_scan();
/* Finished, final check for errors.. */
if ( gblErrorCount > 0 )
exit(1);
- if ( machineSpec == 0 && machineName == 0 )
- hostData << "</host>\n";
-
- /* Open the XML file for writing. */
- ostream *xmlOutFile = new ofstream( xmlFileName );
-
- /* Open the XML file for reading. */
- ifstream *xmlInFile = new ifstream( xmlFileName );
- if ( ! xmlInFile->is_open() )
- error() << "could not open " << xmlFileName << " for reading" << endl;
-
/* Bail on above error. */
if ( gblErrorCount > 0 )
exit(1);
outputActive = false;
}
- XmlScanner xmlScanner( xmlFileName, *xmlInFile );
- XmlParser xmlParser( xmlFileName, outputActive, wantComplete );
- xmlParser.init();
+ InputData inputData( inputFileName, outputActive, wantComplete );
+
+ /* Compiles machines. */
+ inputData.prepareMachineGen();
+
+ if ( gblErrorCount > 0 )
+ exit(1);
+
+ inputData.openOutput();
- /* Write the machines, then the surrounding code. */
- writeMachines( *xmlOutFile, hostData.str(), inputFileName, xmlParser );
+ /* Generates the reduced machine, which we use to write output. */
+ inputData.generateReduced();
+
+ if ( gblErrorCount > 0 )
+ exit(1);
+
+ inputData.openOutput2();
+ inputData.writeOutput();
/* Close the input and the intermediate file. */
- delete xmlOutFile;
delete inFile;
/* Bail on above error. */
if ( gblErrorCount > 0 )
exit(1);
- xml_parse( *xmlInFile, xmlFileName,
- outputActive, wantComplete,
- xmlScanner, xmlParser );
-
/* If writing to a file, delete the ostream, causing it to flush.
* Standard out is flushed automatically. */
if ( outputFileName != 0 ) {
}
-void cleanExit( const char *intermed, int status )
-{
- unlink( intermed );
- exit( status );
-}
/* Main, process args and call yyparse to start scanning input. */
int main( int argc, const char **argv )
{
const char *inputFileName = 0;
processArgs( argc, argv, inputFileName );
+
/* If -M or -S are given and we're not generating a dot file then invoke
* the frontend. These options are not useful with code generators. */
"\" is the same as the input file" << endp;
}
- const char *intermed = openIntermed( inputFileName, outputFileName );
- process( inputFileName, intermed );
+ process( inputFileName );
/* Clean up the intermediate. */
- cleanExit( intermed, 0 );
+ exit( 0 );
return 0;
}