2 * Copyright 2007 Victor Hugo Borja <vic@rubyforge.org>
3 * Copyright 2001-2007 Adrian Thurston <thurston@complang.org>
6 /* This file is part of Ragel.
8 * Ragel is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * Ragel is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with Ragel; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
35 #include "rlgen-ruby.h"
36 #include "ruby-tabcodegen.h"
37 #include "ruby-ftabcodegen.h"
38 #include "ruby-flatcodegen.h"
39 #include "ruby-fflatcodegen.h"
40 #include "rbx-gotocodegen.h"
51 /* Target ruby impl */
52 extern RubyImplEnum rubyImpl;
54 /* Target language and output style. */
55 extern CodeStyleEnum codeStyle;
58 extern istream *inStream;
59 extern ostream *outStream;
60 extern output_filter *outFilter;
61 extern const char *outputFileName;
63 /* Graphviz dot file generation. */
64 extern bool graphvizDone;
66 extern int numSplitPartitions;
69 * Callbacks invoked by the XML data parser.
72 /* Invoked by the parser when the root element is opened. */
73 ostream *rubyOpenOutput( const char *inputFile )
75 if ( hostLang->lang != HostLang::Ruby ) {
76 error() << "this code generator is for Ruby only" << endl;
80 /* If the output format is code and no output file name is given, then
82 if ( outputFileName == 0 ) {
83 const char *ext = findFileExtension( inputFile );
84 if ( ext != 0 && strcmp( ext, ".rh" ) == 0 )
85 outputFileName = fileNameFromStem( inputFile, ".h" );
87 outputFileName = fileNameFromStem( inputFile, ".rb" );
90 /* Make sure we are not writing to the same file as the input file. */
91 if ( outputFileName != 0 && strcmp( inputFile, outputFileName ) == 0 ) {
92 error() << "output file \"" << outputFileName <<
93 "\" is the same as the input file" << endl;
96 if ( outputFileName != 0 ) {
97 /* Create the filter on the output and open it. */
98 outFilter = new output_filter( outputFileName );
99 outFilter->open( outputFileName, ios::out|ios::trunc );
100 if ( !outFilter->is_open() ) {
101 error() << "error opening " << outputFileName << " for writing" << endl;
105 /* Open the output stream, attaching it to the filter. */
106 outStream = new ostream( outFilter );
109 /* Writing out ot std out. */
115 /* Invoked by the parser when a ragel definition is opened. */
116 CodeGenData *rubyMakeCodeGen( const char *sourceFileName, const char *fsmName,
117 ostream &out, bool wantComplete )
119 CodeGenData *codeGen = 0;
120 switch ( codeStyle ) {
122 codeGen = new RubyTabCodeGen(out);
125 codeGen = new RubyFTabCodeGen(out);
128 codeGen = new RubyFlatCodeGen(out);
131 codeGen = new RubyFFlatCodeGen(out);
134 if ( rubyImpl == Rubinius ) {
135 codeGen = new RbxGotoCodeGen(out);
137 cout << "Goto style is still _very_ experimental "
138 "and only supported using Rubinius.\n"
139 "You may want to enable the --rbx flag "
140 " to give it a try.\n";
145 cout << "Invalid code style\n";
149 codeGen->sourceFileName = sourceFileName;
150 codeGen->fsmName = fsmName;
151 codeGen->wantComplete = wantComplete;
159 * indent-tabs-mode: 1
160 * c-file-style: "bsd"