2 * Copyright 2005-2007 Adrian Thurston <thurston@cs.queensu.ca>
5 /* This file is part of Ragel.
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.
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.
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
32 extern bool generateDot
;
35 typedef DList
<GenAction
> GenActionList
;
37 typedef unsigned long ulong
;
39 extern int gblErrorCount
;
43 typedef AvlMap
<char *, CodeGenData
*, CmpStr
> CodeGenMap
;
44 typedef AvlMapEl
<char *, CodeGenData
*> CodeGenMapEl
;
47 * The interface to the parser
50 /* These functions must be implemented by the code generation executable.
51 * The openOutput function is invoked when the root element is opened. The
52 * makeCodeGen function is invoked when a ragel_def element is opened. */
53 std::ostream
*cdOpenOutput( char *inputFile
);
54 std::ostream
*javaOpenOutput( char *inputFile
);
55 std::ostream
*rubyOpenOutput( char *inputFile
);
56 std::ostream
*csharpOpenOutput( char *inputFile
);
57 std::ostream
*dotOpenOutput( char *inputFile
);
59 CodeGenData
*cdMakeCodeGen( char *sourceFileName
,
60 char *fsmName
, ostream
&out
, bool wantComplete
);
61 CodeGenData
*javaMakeCodeGen( char *sourceFileName
,
62 char *fsmName
, ostream
&out
, bool wantComplete
);
63 CodeGenData
*rubyMakeCodeGen( char *sourceFileName
,
64 char *fsmName
, ostream
&out
, bool wantComplete
);
65 CodeGenData
*csharpMakeCodeGen( char *sourceFileName
,
66 char *fsmName
, ostream
&out
, bool wantComplete
);
67 CodeGenData
*dotMakeCodeGen( char *sourceFileName
,
68 char *fsmName
, ostream
&out
, bool wantComplete
);
70 void cdLineDirective( ostream
&out
, const char *fileName
, int line
);
71 void javaLineDirective( ostream
&out
, const char *fileName
, int line
);
72 void rubyLineDirective( ostream
&out
, const char *fileName
, int line
);
73 void csharpLineDirective( ostream
&out
, const char *fileName
, int line
);
74 void genLineDirective( ostream
&out
);
76 /*********************************/
81 * The interface to the code generator.
83 virtual void finishRagelDef() {}
85 /* These are invoked by the corresponding write statements. */
86 virtual void writeData() {};
87 virtual void writeInit() {};
88 virtual void writeExec() {};
89 virtual void writeExports() {};
91 /* This can also be overwridden to modify the processing of write
93 virtual void writeStatement( GenInputLoc
&loc
, int nargs
, char **args
);
95 /********************/
97 CodeGenData( ostream
&out
);
98 virtual ~CodeGenData() {}
101 * Collecting the machine.
104 char *sourceFileName
;
108 GenAction
*allActions
;
109 RedAction
*allActionTables
;
110 Condition
*allConditions
;
111 GenCondSpace
*allCondSpaces
;
112 RedStateAp
*allStates
;
113 NameInst
**nameIndex
;
116 GenActionList actionList
;
117 ConditionList conditionList
;
118 CondSpaceList condSpaceList
;
119 GenInlineList
*getKeyExpr
;
120 GenInlineList
*accessExpr
;
121 GenInlineList
*prePushExpr
;
122 GenInlineList
*postPopExpr
;
124 /* Overriding variables. */
125 GenInlineList
*pExpr
;
126 GenInlineList
*peExpr
;
127 GenInlineList
*eofExpr
;
128 GenInlineList
*csExpr
;
129 GenInlineList
*topExpr
;
130 GenInlineList
*stackExpr
;
131 GenInlineList
*actExpr
;
132 GenInlineList
*tokstartExpr
;
133 GenInlineList
*tokendExpr
;
134 GenInlineList
*dataExpr
;
138 EntryIdVect entryPointIds
;
139 EntryNameVect entryPointNames
;
140 bool hasLongestMatch
;
141 ExportList exportList
;
146 bool writeFirstFinal
;
150 void createMachine();
151 void initActionList( unsigned long length
);
152 void newAction( int anum
, char *name
, int line
, int col
, GenInlineList
*inlineList
);
153 void initActionTableList( unsigned long length
);
154 void initStateList( unsigned long length
);
155 void setStartState( unsigned long startState
);
156 void setErrorState( unsigned long errState
);
157 void addEntryPoint( char *name
, unsigned long entryState
);
158 void setId( int snum
, int id
);
159 void setFinal( int snum
);
160 void initTransList( int snum
, unsigned long length
);
161 void newTrans( int snum
, int tnum
, Key lowKey
, Key highKey
,
162 long targ
, long act
);
163 void finishTransList( int snum
);
164 void setStateActions( int snum
, long toStateAction
,
165 long fromStateAction
, long eofAction
);
166 void setEofTrans( int snum
, long targ
, long eofAction
);
167 void setForcedErrorState()
168 { redFsm
->forcedErrorState
= true; }
171 void initCondSpaceList( ulong length
);
172 void condSpaceItem( int cnum
, long condActionId
);
173 void newCondSpace( int cnum
, int condSpaceId
, Key baseKey
);
175 void initStateCondList( int snum
, ulong length
);
176 void addStateCond( int snum
, Key lowKey
, Key highKey
, long condNum
);
178 GenCondSpace
*findCondSpace( Key lowKey
, Key highKey
);
179 Condition
*findCondition( Key key
);
181 bool setAlphType( char *data
);
183 void resolveTargetStates( GenInlineList
*inlineList
);
186 /* Gather various info on the machine. */
187 void analyzeActionList( RedAction
*redAct
, GenInlineList
*inlineList
);
188 void analyzeAction( GenAction
*act
, GenInlineList
*inlineList
);
189 void findFinalActionRefs();
190 void analyzeMachine();
193 void setValueLimits();
194 void assignActionIds();
196 ostream
&source_warning( const GenInputLoc
&loc
);
197 ostream
&source_error( const GenInputLoc
&loc
);
201 #endif /* _GENDATA_H */