/*
- * Copyright 2001-2006 Adrian Thurston <thurston@complang.org>
+ * Copyright 2001-2008 Adrian Thurston <thurston@complang.org>
*/
/* This file is part of Ragel.
#include "mergesort.h"
#include "xmlcodegen.h"
#include "version.h"
-#include "xmlparse.h"
+#include "inputdata.h"
using namespace std;
}
if ( unusedBits && keyOps->alphType->isSigned && ul >> (size * 8 - 1) )
- ul |= (0xffffffff >> (size*8 ) ) << (size*8);
+ ul |= ( -1L >> (size*8) ) << (size*8);
return Key( (long)ul );
}
exportsRootName(0),
nextEpsilonResolvedLink(0),
nextLongestMatchId(1),
- lmRequiresErrorState(false)
+ lmRequiresErrorState(false),
+ cgd(0)
{
/* Initialize the dictionary of graphs. This is our symbol table. The
* initialization needs to be done on construction which happens at the
{
Expression *expression = new Expression( builtin );
Join *join = new Join( expression );
- JoinOrLm *joinOrLm = new JoinOrLm( join );
- VarDef *varDef = new VarDef( name, joinOrLm );
+ MachineDef *machineDef = new MachineDef( join );
+ VarDef *varDef = new VarDef( name, machineDef );
GraphDictEl *graphDictEl = new GraphDictEl( name, varDef );
graphDict.insert( graphDictEl );
}
InputLoc loc;
loc.line = 1;
loc.col = 1;
- loc.fileName = "<NONE>";
+ loc.fileName = "NONE";
Action *action = new Action( loc, name, inlineList, nextCondId++ );
action->actionRefs.append( rootName );
sectionGraph->setStateNumbers( 0 );
}
-void ParseData::generateXML( ostream &out )
+void ParseData::generateReduced( InputData &inputData )
{
beginProcessing();
+ cgd = makeCodeGen( inputData.inputFileName, sectionName, *inputData.outStream );
+
/* Make the generator. */
- XMLCodeGen codeGen( sectionName, this, sectionGraph, out );
+ BackendGen backendGen( sectionName, this, sectionGraph, cgd );
/* Write out with it. */
- codeGen.writeXML();
+ backendGen.makeBackend();
if ( printStatistics ) {
cerr << "fsm name : " << sectionName << endl;
}
}
-/* Send eof to all parsers. */
-void terminateAllParsers( )
-{
- /* FIXME: a proper token is needed here. Suppose we should use the
- * location of EOF in the last file that the parser was referenced in. */
- InputLoc loc;
- loc.fileName = "<EOF>";
- loc.line = 0;
- loc.col = 0;
- for ( ParserDict::Iter pdel = parserDict; pdel.lte(); pdel++ )
- pdel->value->token( loc, Parser_tk_eof, 0, 0 );
-}
-
-const char *getLang()
+void ParseData::generateXML( ostream &out )
{
- const char *lang = 0;
- switch ( hostLang->lang ) {
- case HostLang::C: lang = "C"; break;
- case HostLang::D: lang = "D"; break;
- case HostLang::Java: lang = "Java"; break;
- case HostLang::Ruby: lang = "Ruby"; break;
- case HostLang::CSharp: lang = "C#"; break;
- }
- return lang;
-}
+ beginProcessing();
-void writeMachines( std::ostream &out, std::string hostData,
- const char *inputFileName, XmlParser &xmlParser )
-{
- if ( machineSpec == 0 && machineName == 0 ) {
- /* No machine spec or machine name given. Generate everything. */
- for ( ParserDict::Iter parser = parserDict; parser.lte(); parser++ ) {
- ParseData *pd = parser->value->pd;
- if ( pd->instanceList.length() > 0 )
- pd->prepareMachineGen( 0 );
- }
+ /* Make the generator. */
+ XMLCodeGen codeGen( sectionName, this, sectionGraph, out );
- if ( gblErrorCount == 0 ) {
- xmlParser.ragel( VERSION, inputFileName, getLang() );
- for ( ParserDict::Iter parser = parserDict; parser.lte(); parser++ ) {
- ParseData *pd = parser->value->pd;
- if ( pd->instanceList.length() > 0 )
- pd->generateXML( out );
- }
- out << hostData;
- }
- }
- else if ( parserDict.length() > 0 ) {
- /* There is either a machine spec or machine name given. */
- ParseData *parseData = 0;
- GraphDictEl *graphDictEl = 0;
-
- /* Traverse the sections, break out when we find a section/machine
- * that matches the one specified. */
- for ( ParserDict::Iter parser = parserDict; parser.lte(); parser++ ) {
- ParseData *checkPd = parser->value->pd;
- if ( machineSpec == 0 || strcmp( checkPd->sectionName, machineSpec ) == 0 ) {
- GraphDictEl *checkGdEl = 0;
- if ( machineName == 0 || (checkGdEl =
- checkPd->graphDict.find( machineName )) != 0 )
- {
- /* Have a machine spec and/or machine name that matches
- * the -M/-S options. */
- parseData = checkPd;
- graphDictEl = checkGdEl;
- break;
- }
- }
- }
+ /* Write out with it. */
+ codeGen.writeXML();
- if ( parseData == 0 )
- error() << "could not locate machine specified with -S and/or -M" << endl;
- else {
- /* Section/Machine to emit was found. Prepare and emit it. */
- parseData->prepareMachineGen( graphDictEl );
- if ( gblErrorCount == 0 ) {
- xmlParser.ragel( VERSION, inputFileName, getLang() );
- parseData->generateXML( out );
- out << hostData;
- }
- }
+ if ( printStatistics ) {
+ cerr << "fsm name : " << sectionName << endl;
+ cerr << "num states: " << sectionGraph->stateList.length() << endl;
+ cerr << endl;
}
}
+