| 3424 | |
| 3425 | #ifndef WITH_NO_CODEGEN |
| 3426 | void Pattern::gencode_dfa_closure(FILE *file, const DFA::State *state, int nest, bool peek) const |
| 3427 | { |
| 3428 | bool elif = false; |
| 3429 | if (state->redo) |
| 3430 | { |
| 3431 | if (peek) |
| 3432 | ::fprintf(file, "%*sm.FSM_REDO(c);\n", 2*nest, ""); |
| 3433 | else |
| 3434 | ::fprintf(file, "%*sm.FSM_REDO();\n", 2*nest, ""); |
| 3435 | } |
| 3436 | else if (state->accept > 0) |
| 3437 | { |
| 3438 | if (peek) |
| 3439 | ::fprintf(file, "%*sm.FSM_TAKE(%u, c);\n", 2*nest, "", state->accept); |
| 3440 | else |
| 3441 | ::fprintf(file, "%*sm.FSM_TAKE(%u);\n", 2*nest, "", state->accept); |
| 3442 | } |
| 3443 | for (Lookaheads::const_iterator i = state->tails.begin(); i != state->tails.end(); ++i) |
| 3444 | ::fprintf(file, "%*sm.FSM_TAIL(%u);\n", 2*nest, "", *i); |
| 3445 | if (nest > 5) |
| 3446 | return; |
| 3447 | for (DFA::State::Edges::const_reverse_iterator i = state->edges.rbegin(); i != state->edges.rend(); ++i) |
| 3448 | { |
| 3449 | #if WITH_COMPACT_DFA == -1 |
| 3450 | Char lo = i->first; |
| 3451 | Char hi = i->second.first; |
| 3452 | #else |
| 3453 | Char hi = i->first; |
| 3454 | Char lo = i->second.first; |
| 3455 | #endif |
| 3456 | if (is_meta(lo)) |
| 3457 | { |
| 3458 | do |
| 3459 | { |
| 3460 | switch (lo) |
| 3461 | { |
| 3462 | case META_EOB: |
| 3463 | case META_EOL: |
| 3464 | case META_EWE: |
| 3465 | case META_BWE: |
| 3466 | case META_NWE: |
| 3467 | case META_WBE: |
| 3468 | ::fprintf(file, "%*s", 2*nest, ""); |
| 3469 | if (elif) |
| 3470 | ::fprintf(file, "else "); |
| 3471 | ::fprintf(file, "if (m.FSM_META_%s(c)) {\n", meta_label[lo - META_MIN]); |
| 3472 | gencode_dfa_closure(file, i->second.second, nest + 1, peek); |
| 3473 | ::fprintf(file, "%*s}\n", 2*nest, ""); |
| 3474 | elif = true; |
| 3475 | break; |
| 3476 | default: |
| 3477 | ::fprintf(file, "%*s", 2*nest, ""); |
| 3478 | if (elif) |
| 3479 | ::fprintf(file, "else "); |
| 3480 | ::fprintf(file, "if (m.FSM_META_%s()) {\n", meta_label[lo - META_MIN]); |
| 3481 | gencode_dfa_closure(file, i->second.second, nest + 1, peek); |
| 3482 | ::fprintf(file, "%*s}\n", 2*nest, ""); |
| 3483 | elif = true; |
nothing calls this directly
no test coverage detected