#include <string>
#include <assert.h>
-/* Code generators. */
-#include "cdtable.h"
-#include "cdftable.h"
-#include "cdflat.h"
-#include "cdfflat.h"
-#include "cdgoto.h"
-#include "cdfgoto.h"
-#include "cdipgoto.h"
-#include "cdsplit.h"
using std::ostream;
using std::ostringstream;
using std::endl;
/* Target language and output style. */
-extern CodeStyleEnum codeStyle;
/* Io globals. */
extern istream *inStream;
extern int numSplitPartitions;
extern bool noLineDirectives;
-/* Invoked by the parser when a ragel definition is opened. */
-CodeGenData *cdMakeCodeGen( const char *sourceFileName, const char *fsmName,
- ostream &out, bool wantComplete )
-{
- CodeGenData *codeGen = 0;
- switch ( hostLang->lang ) {
- case HostLang::C:
- switch ( codeStyle ) {
- case GenTables:
- codeGen = new CTabCodeGen(out);
- break;
- case GenFTables:
- codeGen = new CFTabCodeGen(out);
- break;
- case GenFlat:
- codeGen = new CFlatCodeGen(out);
- break;
- case GenFFlat:
- codeGen = new CFFlatCodeGen(out);
- break;
- case GenGoto:
- codeGen = new CGotoCodeGen(out);
- break;
- case GenFGoto:
- codeGen = new CFGotoCodeGen(out);
- break;
- case GenIpGoto:
- codeGen = new CIpGotoCodeGen(out);
- break;
- case GenSplit:
- codeGen = new CSplitCodeGen(out);
- break;
- }
- break;
-
- case HostLang::D:
- switch ( codeStyle ) {
- case GenTables:
- codeGen = new DTabCodeGen(out);
- break;
- case GenFTables:
- codeGen = new DFTabCodeGen(out);
- break;
- case GenFlat:
- codeGen = new DFlatCodeGen(out);
- break;
- case GenFFlat:
- codeGen = new DFFlatCodeGen(out);
- break;
- case GenGoto:
- codeGen = new DGotoCodeGen(out);
- break;
- case GenFGoto:
- codeGen = new DFGotoCodeGen(out);
- break;
- case GenIpGoto:
- codeGen = new DIpGotoCodeGen(out);
- break;
- case GenSplit:
- codeGen = new DSplitCodeGen(out);
- break;
- }
- break;
-
- default: break;
- }
-
- codeGen->sourceFileName = sourceFileName;
- codeGen->fsmName = fsmName;
- codeGen->wantComplete = wantComplete;
-
- return codeGen;
-}
-
-
void cdLineDirective( ostream &out, const char *fileName, int line )
{
if ( noLineDirectives )
struct LongestMatch;
struct LongestMatchPart;
-inline string itoa( int i )
-{
- char buf[16];
- sprintf( buf, "%i", i );
- return buf;
-}
+string itoa( int i );
/*
* class FsmCodeGen
extern exit_object endp;
void operator<<( std::ostream &out, exit_object & );
-/* Target output style. */
-enum CodeStyleEnum
-{
- GenTables,
- GenFTables,
- GenFlat,
- GenFFlat,
- GenGoto,
- GenFGoto,
- GenIpGoto,
- GenSplit
-};
-
-/* Target implementation */
-enum RubyImplEnum
-{
- MRI,
- Rubinius
-};
-
#endif
#include <string>
#include <assert.h>
-/* Code generators. */
-#include "cstable.h"
-#include "csftable.h"
-#include "csflat.h"
-#include "csfflat.h"
-#include "csgoto.h"
-#include "csfgoto.h"
-#include "csipgoto.h"
-#include "cssplit.h"
-
using std::ostream;
using std::ostringstream;
using std::string;
using std::cerr;
using std::endl;
-/* Invoked by the parser when a ragel definition is opened. */
-CodeGenData *csharpMakeCodeGen( const char *sourceFileName, const char *fsmName,
- ostream &out, bool wantComplete )
-{
- CodeGenData *codeGen = 0;
-
- switch ( codeStyle ) {
- case GenTables:
- codeGen = new CSharpTabCodeGen(out);
- break;
- case GenFTables:
- codeGen = new CSharpFTabCodeGen(out);
- break;
- case GenFlat:
- codeGen = new CSharpFlatCodeGen(out);
- break;
- case GenFFlat:
- codeGen = new CSharpFFlatCodeGen(out);
- break;
- case GenGoto:
- codeGen = new CSharpGotoCodeGen(out);
- break;
- case GenFGoto:
- codeGen = new CSharpFGotoCodeGen(out);
- break;
- case GenIpGoto:
- codeGen = new CSharpIpGotoCodeGen(out);
- break;
- case GenSplit:
- codeGen = new CSharpSplitCodeGen(out);
- break;
- }
-
- codeGen->sourceFileName = sourceFileName;
- codeGen->fsmName = fsmName;
- codeGen->wantComplete = wantComplete;
-
- return codeGen;
-}
-
void csharpLineDirective( ostream &out, const char *fileName, int line )
{
if ( noLineDirectives )
struct LongestMatch;
struct LongestMatchPart;
-inline string itoa( int i )
-{
- char buf[16];
- sprintf( buf, "%i", i );
- return buf;
-}
+string itoa( int i );
/*
* class CSharpFsmCodeGen
using std::cerr;
using std::endl;
-/* Invoked by the parser when a ragel definition is opened. */
-CodeGenData *dotMakeCodeGen( const char *sourceFileName, const char *fsmName,
- ostream &out, bool wantComplete )
-{
- CodeGenData *codeGen = new GraphvizDotGen(out);
-
- codeGen->sourceFileName = sourceFileName;
- codeGen->fsmName = fsmName;
- codeGen->wantComplete = wantComplete;
-
- return codeGen;
-}
-
/* Override this so that write statement processing is ignored */
void GraphvizDotGen::writeStatement( InputLoc &, int, char ** )
{
*/
#include "gendata.h"
+#include "ragel.h"
#include <iostream>
+/*
+ * Code generators.
+ */
+
+#include "cstable.h"
+#include "csftable.h"
+#include "csflat.h"
+#include "csfflat.h"
+#include "csgoto.h"
+#include "csfgoto.h"
+#include "csipgoto.h"
+#include "cssplit.h"
+
+#include "cdtable.h"
+#include "cdftable.h"
+#include "cdflat.h"
+#include "cdfflat.h"
+#include "cdgoto.h"
+#include "cdfgoto.h"
+#include "cdipgoto.h"
+#include "cdsplit.h"
+
+#include "dotcodegen.h"
+
+#include "javacodegen.h"
+
+#include "rubytable.h"
+#include "rubyftable.h"
+#include "rubyflat.h"
+#include "rubyfflat.h"
+#include "rbxgoto.h"
+
+string itoa( int i )
+{
+ char buf[16];
+ sprintf( buf, "%i", i );
+ return buf;
+}
+
+using std::cout;
using std::cerr;
using std::endl;
+/* Invoked by the parser when a ragel definition is opened. */
+CodeGenData *dotMakeCodeGen( const char *sourceFileName, const char *fsmName,
+ ostream &out, bool wantComplete )
+{
+ CodeGenData *codeGen = new GraphvizDotGen(out);
+
+ codeGen->sourceFileName = sourceFileName;
+ codeGen->fsmName = fsmName;
+ codeGen->wantComplete = wantComplete;
+
+ return codeGen;
+}
+
+/* Invoked by the parser when a ragel definition is opened. */
+CodeGenData *cdMakeCodeGen( const char *sourceFileName, const char *fsmName,
+ ostream &out, bool wantComplete )
+{
+ CodeGenData *codeGen = 0;
+ switch ( hostLang->lang ) {
+ case HostLang::C:
+ switch ( codeStyle ) {
+ case GenTables:
+ codeGen = new CTabCodeGen(out);
+ break;
+ case GenFTables:
+ codeGen = new CFTabCodeGen(out);
+ break;
+ case GenFlat:
+ codeGen = new CFlatCodeGen(out);
+ break;
+ case GenFFlat:
+ codeGen = new CFFlatCodeGen(out);
+ break;
+ case GenGoto:
+ codeGen = new CGotoCodeGen(out);
+ break;
+ case GenFGoto:
+ codeGen = new CFGotoCodeGen(out);
+ break;
+ case GenIpGoto:
+ codeGen = new CIpGotoCodeGen(out);
+ break;
+ case GenSplit:
+ codeGen = new CSplitCodeGen(out);
+ break;
+ }
+ break;
+
+ case HostLang::D:
+ switch ( codeStyle ) {
+ case GenTables:
+ codeGen = new DTabCodeGen(out);
+ break;
+ case GenFTables:
+ codeGen = new DFTabCodeGen(out);
+ break;
+ case GenFlat:
+ codeGen = new DFlatCodeGen(out);
+ break;
+ case GenFFlat:
+ codeGen = new DFFlatCodeGen(out);
+ break;
+ case GenGoto:
+ codeGen = new DGotoCodeGen(out);
+ break;
+ case GenFGoto:
+ codeGen = new DFGotoCodeGen(out);
+ break;
+ case GenIpGoto:
+ codeGen = new DIpGotoCodeGen(out);
+ break;
+ case GenSplit:
+ codeGen = new DSplitCodeGen(out);
+ break;
+ }
+ break;
+
+ default: break;
+ }
+
+ codeGen->sourceFileName = sourceFileName;
+ codeGen->fsmName = fsmName;
+ codeGen->wantComplete = wantComplete;
+
+ return codeGen;
+}
+
+/* Invoked by the parser when a ragel definition is opened. */
+CodeGenData *javaMakeCodeGen( const char *sourceFileName, const char *fsmName,
+ ostream &out, bool wantComplete )
+{
+ CodeGenData *codeGen = new JavaTabCodeGen(out);
+
+ codeGen->sourceFileName = sourceFileName;
+ codeGen->fsmName = fsmName;
+ codeGen->wantComplete = wantComplete;
+
+ return codeGen;
+}
+
+/* Invoked by the parser when a ragel definition is opened. */
+CodeGenData *rubyMakeCodeGen( const char *sourceFileName, const char *fsmName,
+ ostream &out, bool wantComplete )
+{
+ CodeGenData *codeGen = 0;
+ switch ( codeStyle ) {
+ case GenTables:
+ codeGen = new RubyTabCodeGen(out);
+ break;
+ case GenFTables:
+ codeGen = new RubyFTabCodeGen(out);
+ break;
+ case GenFlat:
+ codeGen = new RubyFlatCodeGen(out);
+ break;
+ case GenFFlat:
+ codeGen = new RubyFFlatCodeGen(out);
+ break;
+ case GenGoto:
+ if ( rubyImpl == Rubinius ) {
+ codeGen = new RbxGotoCodeGen(out);
+ } else {
+ cerr << "Goto style is still _very_ experimental "
+ "and only supported using Rubinius.\n"
+ "You may want to enable the --rbx flag "
+ " to give it a try.\n";
+ exit(1);
+ }
+ break;
+ default:
+ cout << "Invalid code style\n";
+ exit(1);
+ break;
+ }
+ codeGen->sourceFileName = sourceFileName;
+ codeGen->fsmName = fsmName;
+ codeGen->wantComplete = wantComplete;
+
+ return codeGen;
+}
+
+/* Invoked by the parser when a ragel definition is opened. */
+CodeGenData *csharpMakeCodeGen( const char *sourceFileName, const char *fsmName,
+ ostream &out, bool wantComplete )
+{
+ CodeGenData *codeGen = 0;
+
+ switch ( codeStyle ) {
+ case GenTables:
+ codeGen = new CSharpTabCodeGen(out);
+ break;
+ case GenFTables:
+ codeGen = new CSharpFTabCodeGen(out);
+ break;
+ case GenFlat:
+ codeGen = new CSharpFlatCodeGen(out);
+ break;
+ case GenFFlat:
+ codeGen = new CSharpFFlatCodeGen(out);
+ break;
+ case GenGoto:
+ codeGen = new CSharpGotoCodeGen(out);
+ break;
+ case GenFGoto:
+ codeGen = new CSharpFGotoCodeGen(out);
+ break;
+ case GenIpGoto:
+ codeGen = new CSharpIpGotoCodeGen(out);
+ break;
+ case GenSplit:
+ codeGen = new CSharpSplitCodeGen(out);
+ break;
+ }
+
+ codeGen->sourceFileName = sourceFileName;
+ codeGen->fsmName = fsmName;
+ codeGen->wantComplete = wantComplete;
+
+ return codeGen;
+}
+
+
CodeGenData *makeCodeGen( const char *sourceFileName, const char *fsmName,
ostream &out, bool wantComplete )
{
typedef AvlMap<char *, CodeGenData*, CmpStr> CodeGenMap;
typedef AvlMapEl<char *, CodeGenData*> CodeGenMapEl;
-/*
- * The interface to the parser
- */
-
-/* These functions must be implemented by the code generation executable.
- * The openOutput function is invoked when the root element is opened. The
- * makeCodeGen function is invoked when a ragel_def element is opened. */
-std::ostream *cdOpenOutput( const char *inputFile );
-std::ostream *javaOpenOutput( const char *inputFile );
-std::ostream *rubyOpenOutput( const char *inputFile );
-std::ostream *csharpOpenOutput( const char *inputFile );
-std::ostream *dotOpenOutput( const char *inputFile );
-
-CodeGenData *cdMakeCodeGen( const char *sourceFileName,
- const char *fsmName, ostream &out, bool wantComplete );
-CodeGenData *javaMakeCodeGen( const char *sourceFileName,
- const char *fsmName, ostream &out, bool wantComplete );
-CodeGenData *rubyMakeCodeGen( const char *sourceFileName,
- const char *fsmName, ostream &out, bool wantComplete );
-CodeGenData *csharpMakeCodeGen( const char *sourceFileName,
- const char *fsmName, ostream &out, bool wantComplete );
-CodeGenData *dotMakeCodeGen( const char *sourceFileName,
- const char *fsmName, ostream &out, bool wantComplete );
-
void cdLineDirective( ostream &out, const char *fileName, int line );
void javaLineDirective( ostream &out, const char *fileName, int line );
void rubyLineDirective( ostream &out, const char *fileName, int line );
void genLineDirective( ostream &out );
void lineDirective( ostream &out, const char *fileName, int line );
+string itoa( int i );
+
/*********************************/
struct CodeGenData
using std::cerr;
using std::endl;
-/* Invoked by the parser when a ragel definition is opened. */
-CodeGenData *javaMakeCodeGen( const char *sourceFileName, const char *fsmName,
- ostream &out, bool wantComplete )
-{
- CodeGenData *codeGen = new JavaTabCodeGen(out);
-
- codeGen->sourceFileName = sourceFileName;
- codeGen->fsmName = fsmName;
- codeGen->wantComplete = wantComplete;
-
- return codeGen;
-}
-
void javaLineDirective( ostream &out, const char *fileName, int line )
{
/* Write the preprocessor line info for to the input file. */
bool generateDot = false;
/* Target language and output style. */
-CodeStyleEnum codeStyle = GenTables;
+CodeStyle codeStyle = GenTables;
int numSplitPartitions = 0;
bool noLineDirectives = false;
#define PROGNAME "ragel"
+/* Target output style. */
+enum CodeStyle
+{
+ GenTables,
+ GenFTables,
+ GenFlat,
+ GenFFlat,
+ GenGoto,
+ GenFGoto,
+ GenIpGoto,
+ GenSplit
+};
+
/* To what degree are machine minimized. */
enum MinimizeLevel {
MinimizeApprox,
MinimizeEveryOp
};
+/* Target implementation */
+enum RubyImplEnum
+{
+ MRI,
+ Rubinius
+};
+
/* Options. */
extern MinimizeLevel minimizeLevel;
extern MinimizeOpt minimizeOpt;
extern bool printStatistics;
extern bool wantDupsRemoved;
extern bool generateDot;
+extern RubyImplEnum rubyImpl;
/* Error reporting format. */
enum ErrorFormat {
typedef Vector<const char *> ArgsVector;
extern ArgsVector includePaths;
-extern CodeStyleEnum codeStyle;
+extern CodeStyle codeStyle;
/* IO filenames and stream. */
extern bool displayPrintables;
std::ostream &error();
/* Target language and output style. */
-extern CodeStyleEnum codeStyle;
+extern CodeStyle codeStyle;
/* Io globals. */
extern std::istream *inStream;
using std::endl;
/* Target ruby impl */
-extern RubyImplEnum rubyImpl;
/* Target language and output style. */
-extern CodeStyleEnum codeStyle;
+extern CodeStyle codeStyle;
/* Io globals. */
extern istream *inStream;
* Callbacks invoked by the XML data parser.
*/
-/* Invoked by the parser when a ragel definition is opened. */
-CodeGenData *rubyMakeCodeGen( const char *sourceFileName, const char *fsmName,
- ostream &out, bool wantComplete )
-{
- CodeGenData *codeGen = 0;
- switch ( codeStyle ) {
- case GenTables:
- codeGen = new RubyTabCodeGen(out);
- break;
- case GenFTables:
- codeGen = new RubyFTabCodeGen(out);
- break;
- case GenFlat:
- codeGen = new RubyFlatCodeGen(out);
- break;
- case GenFFlat:
- codeGen = new RubyFFlatCodeGen(out);
- break;
- case GenGoto:
- if ( rubyImpl == Rubinius ) {
- codeGen = new RbxGotoCodeGen(out);
- } else {
- cout << "Goto style is still _very_ experimental "
- "and only supported using Rubinius.\n"
- "You may want to enable the --rbx flag "
- " to give it a try.\n";
- exit(1);
- }
- break;
- default:
- cout << "Invalid code style\n";
- exit(1);
- break;
- }
- codeGen->sourceFileName = sourceFileName;
- codeGen->fsmName = fsmName;
- codeGen->wantComplete = wantComplete;
-
- return codeGen;
-}
-
void rubyLineDirective( ostream &out, const char *fileName, int line )
{
/* Integer array line length. */
#define IALL 8
-inline string itoa( int i )
-{
- char buf[16];
- sprintf( buf, "%i", i );
- return buf;
-}
-
class RubyCodeGen : public CodeGenData
{