X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=ragel%2Fparsedata.cpp;h=8ce89db64687486827332ae335246c9884f8e1ec;hb=9f3c2baa91083bb5b33b4f3ec07f58d900157e32;hp=6e2558b27b0d4a364fa42641bf9936be32074478;hpb=5d9e2032588f4896780617065d6704979cdfcaef;p=external%2Fragel.git diff --git a/ragel/parsedata.cpp b/ragel/parsedata.cpp index 6e2558b..8ce89db 100644 --- a/ragel/parsedata.cpp +++ b/ragel/parsedata.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Adrian Thurston + * Copyright 2001-2008 Adrian Thurston */ /* This file is part of Ragel. @@ -32,6 +32,7 @@ #include "mergesort.h" #include "xmlcodegen.h" #include "version.h" +#include "inputdata.h" using namespace std; @@ -114,7 +115,7 @@ Key makeFsmKeyHex( char *str, const InputLoc &loc, ParseData *pd ) } 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 ); } @@ -416,7 +417,7 @@ bool NameInst::anyRefsRec() /* Initialize the structure that will collect info during the parse of a * machine. */ -ParseData::ParseData( char *fileName, char *sectionName, +ParseData::ParseData( const char *fileName, char *sectionName, const InputLoc §ionLoc ) : sectionGraph(0), @@ -452,7 +453,8 @@ ParseData::ParseData( char *fileName, char *sectionName, 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 @@ -827,8 +829,8 @@ void ParseData::createBuiltin( const char *name, BuiltinMachine builtin ) { 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 ); } @@ -969,7 +971,7 @@ Action *ParseData::newAction( const char *name, InlineList *inlineList ) InputLoc loc; loc.line = 1; loc.col = 1; - loc.fileName = ""; + loc.fileName = "NONE"; Action *action = new Action( loc, name, inlineList, nextCondId++ ); action->actionRefs.append( rootName ); @@ -1426,15 +1428,17 @@ void ParseData::prepareMachineGenTBWrapped( GraphDictEl *graphDictEl ) 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; @@ -1443,92 +1447,20 @@ void ParseData::generateXML( ostream &out ) } } -/* 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 = ""; - loc.line = 0; - loc.col = 0; - for ( ParserDict::Iter pdel = parserDict; pdel.lte(); pdel++ ) - pdel->value->token( loc, _eof, 0, 0 ); -} - -void writeLanguage( std::ostream &out ) +void ParseData::generateXML( ostream &out ) { - out << " lang=\""; - switch ( hostLang->lang ) { - case HostLang::C: out << "C"; break; - case HostLang::D: out << "D"; break; - case HostLang::Java: out << "Java"; break; - case HostLang::Ruby: out << "Ruby"; break; - case HostLang::CSharp: out << "C#"; break; - } - out << "\""; - -} + beginProcessing(); -void writeMachines( std::ostream &out, std::string hostData, char *inputFileName ) -{ - 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 ) { - out << "\n"; - for ( ParserDict::Iter parser = parserDict; parser.lte(); parser++ ) { - ParseData *pd = parser->value->pd; - if ( pd->instanceList.length() > 0 ) - pd->generateXML( out ); - } - out << hostData; - out << "\n"; - } - } - 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 ) { - out << "\n"; - parseData->generateXML( out ); - out << hostData; - out << "\n"; - } - } + if ( printStatistics ) { + cerr << "fsm name : " << sectionName << endl; + cerr << "num states: " << sectionGraph->stateList.length() << endl; + cerr << endl; } } +