cc302baf2a8c0458354e371f6cfde4569f5cc472
[external/ragel.git] / rlcodegen / rlcodegen.h
1 /*
2  *  Copyright 2001-2006 Adrian Thurston <thurston@cs.queensu.ca>
3  */
4
5 /*  This file is part of Ragel.
6  *
7  *  Ragel is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2 of the License, or
10  *  (at your option) any later version.
11  * 
12  *  Ragel is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  * 
17  *  You should have received a copy of the GNU General Public License
18  *  along with Ragel; if not, write to the Free Software
19  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
20  */
21
22 #ifndef _RLCODEGEN_H
23 #define _RLCODEGEN_H
24
25 #include <stdio.h>
26 #include <iostream>
27 #include <fstream>
28 #include "avltree.h"
29 #include "vector.h"
30 #include "config.h"
31
32 #define PROGNAME "rlcodegen"
33
34 /* Target language. */
35 enum OutputFormat
36 {
37         OutCode,
38         OutGraphvizDot
39 };
40
41 /* Target output style. */
42 enum CodeStyleEnum
43 {
44         GenTables,
45         GenFTables,
46         GenFlat,
47         GenFFlat,
48         GenGoto,
49         GenFGoto,
50         GenIpGoto,
51         GenSplit
52 };
53
54 /* Filter on the output stream that keeps track of the number of lines
55  * output. */
56 class output_filter : public std::filebuf
57 {
58 public:
59         output_filter() : line(1) { }
60
61         virtual int sync();
62         virtual std::streamsize xsputn(const char* s, std::streamsize n);
63
64         int line;
65 };
66         
67 extern OutputFormat outputFormat;
68 extern CodeStyleEnum codeStyle;
69
70 /* IO filenames and stream. */
71 extern char *outputFileName;
72 extern std::ostream *outStream;
73 extern output_filter *outFilter;
74
75 extern bool printPrintables;
76 extern bool graphvizDone;
77
78 int xml_parse( std::istream &input, char *fileName );
79
80 extern int gblErrorCount;
81 extern char machineMain[];
82
83 extern int numSplitPartitions;
84
85 /* 
86  * Error reporting. 
87  */
88
89 /* Location in an input file. */
90 struct InputLoc
91 {
92         int line;
93         int col;
94 };
95
96 struct AttrMarker
97 {
98         char *id;
99         int idLen;
100         char *value;
101         int valueLen;
102 };
103
104 struct Attribute
105 {
106         char *id;
107         char *value;
108 };
109
110 typedef Vector<AttrMarker> AttrMkList;
111 typedef Vector<Attribute> AttrList;
112 struct XMLTagHashPair;
113
114 struct XMLTag
115 {
116         enum TagType { Open, Close };
117
118         XMLTag( XMLTagHashPair *tagId, TagType type ) : 
119                 tagId(tagId), type(type), 
120                 content(0), attrList(0) {}
121         
122         Attribute *findAttr( char *id )
123         {
124                 if ( attrList != 0 ) {
125                         for ( AttrList::Iter attr = *attrList; attr.lte(); attr++ ) {
126                                 if ( strcmp( id, attr->id ) == 0 )
127                                         return attr;
128                         }
129                 }
130                 return 0;
131         }
132
133         XMLTagHashPair *tagId;
134         TagType type;
135
136         /* Content is associtated with closing tags. */
137         char *content;
138
139         /* Attribute lists are associated with opening tags. */
140         AttrList *attrList;
141 };
142
143
144 std::ostream &error();
145 //std::ostream &error( const YYLTYPE &loc ); 
146 std::ostream &error( const InputLoc &loc ); 
147 std::ostream &error( int first_line, int first_column );
148 std::ostream &warning( ); 
149 std::ostream &warning( const InputLoc &loc ); 
150 std::ostream &warning( int first_line, int first_column );
151 std::ostream &xml_error( const InputLoc &loc );
152 //std::ostream &xml_error( const YYLTYPE &loc ); 
153
154
155
156 void openOutput( char *inputFile );
157 char *fileNameFromStem( char *stemFile, char *suffix );
158
159 /* Size of the include stack. */
160 #define INCLUDE_STACK_SIZE 32
161
162 #endif /* _RLCODEGEN_H */