2 * Copyright 2001-2007 Adrian Thurston <thurston@complang.org>
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 #define XML_BUFSIZE 4096
48 typedef Vector<AttrMarker> AttrMkList;
49 typedef Vector<Attribute> AttrList;
50 struct XMLTagHashPair;
54 enum TagType { Open, Close };
56 XMLTag( XMLTagHashPair *tagId, TagType type ) :
57 tagId(tagId), type(type),
58 content(0), attrList(0) {}
60 Attribute *findAttr( const char *id )
62 if ( attrList != 0 ) {
63 for ( AttrList::Iter attr = *attrList; attr.lte(); attr++ ) {
64 if ( strcmp( id, attr->id ) == 0 )
71 XMLTagHashPair *tagId;
74 /* Content is associtated with closing tags. */
77 /* Attribute lists are associated with opening tags. */
94 struct LmSwitchAction;
98 XmlScanner( const char *fileName, istream &input );
101 void adjustAttrPointers( int distance );
102 std::ostream &error();
104 const char *fileName;
108 int cs, act, have, curline, curcol;
117 AttrMkList attrMkList;
121 int token_col, token_line;
123 char buf[XML_BUFSIZE];
132 token TAG_unknown, TAG_ragel, TAG_ragel_def, TAG_host, TAG_state_list,
133 TAG_state, TAG_trans_list, TAG_t, TAG_machine, TAG_start_state,
134 TAG_error_state, TAG_action_list, TAG_action_table_list,
135 TAG_action, TAG_action_table, TAG_alphtype, TAG_element,
136 TAG_getkey, TAG_state_actions, TAG_entry_points, TAG_sub_action,
137 TAG_cond_space_list, TAG_cond_space, TAG_cond_list, TAG_c,
140 # Inline block tokens.
141 token TAG_text, TAG_goto, TAG_call, TAG_next, TAG_goto_expr,
142 TAG_call_expr, TAG_next_expr, TAG_ret, TAG_pchar, TAG_char,
143 TAG_hold, TAG_exec, TAG_curs, TAG_targs, TAG_entry, TAG_data,
144 TAG_lm_switch, TAG_init_act, TAG_set_act, TAG_set_tokend,
145 TAG_get_tokend, TAG_init_tokstart, TAG_set_tokstart;
147 token TAG_write, TAG_access, TAG_break, TAG_arg, TAG_cs_expr;
149 token TAG_p_expr, TAG_pe_expr, TAG_eof_expr, TAG_cs_expr, TAG_top_expr,
150 TAG_stack_expr, TAG_act_expr, TAG_tokstart_expr, TAG_tokend_expr,
151 TAG_data_expr, TAG_prepush, TAG_postpop, TAG_eof_t;
154 %% write instance_data;
157 int parseLangEl( int type, const Token *token );
159 XmlParser( const char *fileName, bool outputActive, bool wantComplete ) :
160 fileName(fileName), sourceFileName(0), outStream(0),
161 outputActive(outputActive), wantComplete(wantComplete),
164 int token( int tokenId, Token &token );
165 int token( int tokenId, int col, int line );
166 int token( XMLTag *tag, int col, int line );
168 void ragel( const char *fileName );
170 /* Report an error encountered by the parser. */
171 ostream &warning( const GenInputLoc &loc );
173 ostream &error( const GenInputLoc &loc );
174 ostream &parser_error( int tokId, Token &token );
175 ostream &source_error( const GenInputLoc &loc );
177 /* The name of the root section, this does not change during an include. */
178 const char *fileName;
179 const char *sourceFileName;
184 /* Collected during parsing. */
195 CodeGenMap codeGenMap;
197 Vector <char*> writeOptions;
202 int xml_parse( std::istream &input, const char *fileName,
203 bool outputActive, bool wantComplete,
204 XmlScanner &scanner, XmlParser &parser );
206 #endif /* _XMLPARSE_H */