| 2187 | { |
| 2188 | |
| 2189 | void parse(Scanner& i, Output & o) |
| 2190 | { |
| 2191 | std::map<std::string, smart_ptr<DFA> > dfa_map; |
| 2192 | ScannerState rules_state; |
| 2193 | |
| 2194 | in = &i; |
| 2195 | |
| 2196 | o.source.wversion_time () |
| 2197 | .wline_info (in->get_cline (), in->get_fname ().c_str ()); |
| 2198 | if (opts->target == opt_t::SKELETON) |
| 2199 | { |
| 2200 | Skeleton::emit_prolog (o.source); |
| 2201 | } |
| 2202 | |
| 2203 | Enc encodingOld = opts->encoding; |
| 2204 | |
| 2205 | while ((parseMode = i.echo()) != Scanner::Stop) |
| 2206 | { |
| 2207 | o.source.new_block (); |
| 2208 | bool bPrologBrace = false; |
| 2209 | ScannerState curr_state; |
| 2210 | |
| 2211 | i.save_state(curr_state); |
| 2212 | foundRules = false; |
| 2213 | |
| 2214 | if (opts->rFlag && parseMode == Scanner::Rules && dfa_map.size()) |
| 2215 | { |
| 2216 | in->fatal("cannot have a second 'rules:re2c' block"); |
| 2217 | } |
| 2218 | if (parseMode == Scanner::Reuse) |
| 2219 | { |
| 2220 | if (dfa_map.empty()) |
| 2221 | { |
| 2222 | in->fatal("got 'use:re2c' without 'rules:re2c'"); |
| 2223 | } |
| 2224 | } |
| 2225 | else if (parseMode == Scanner::Rules) |
| 2226 | { |
| 2227 | i.save_state(rules_state); |
| 2228 | } |
| 2229 | else |
| 2230 | { |
| 2231 | dfa_map.clear(); |
| 2232 | } |
| 2233 | rank_counter.reset (); |
| 2234 | spec.clear (); |
| 2235 | in->set_in_parse(true); |
| 2236 | yyparse(); |
| 2237 | in->set_in_parse(false); |
| 2238 | if (opts->rFlag && parseMode == Scanner::Reuse) |
| 2239 | { |
| 2240 | if (foundRules || opts->encoding != encodingOld) |
| 2241 | { |
| 2242 | // Re-parse rules |
| 2243 | parseMode = Scanner::Parse; |
| 2244 | i.restore_state(rules_state); |
| 2245 | i.reuse(); |
| 2246 | dfa_map.clear(); |
no test coverage detected