/* Generated by re2d */
// re2d $INPUT -o $OUTPUT -i

import core.stdc.stdlib;
import core.stdc.string;

enum YYMaxFill = 2;




private int lex_simple(immutable char[] str) {
    const(char)* yycursor = cast(char*)str;
    const(char)* yylimit = yycursor + str.length;;
    const(char)* yymarker;

    
{
    char yych;
    if (yylimit <= yycursor) goto yy8;
    yych = *yycursor;
    switch (yych) {
        case 'a': goto yy3;
        case 'b': goto yy4;
        case 'c': goto yy5;
        default: goto yy1;
    }
yy1:
    ++yycursor;
yy2:
    { return 1; }
yy3:
    ++yycursor;
    if (yylimit <= yycursor) goto yy9;
    { return 3; }
yy4:
    ++yycursor;
    { return 4; }
yy5:
    yymarker = ++yycursor;
    if (yylimit <= yycursor) goto yy10;
    yych = *yycursor;
    switch (yych) {
        case 'c': goto yy6;
        default: goto yy2;
    }
yy6:
    ++yycursor;
    if (yylimit <= yycursor) goto yy10;
    yych = *yycursor;
    switch (yych) {
        case 'c': goto yy6;
        default: goto yy7;
    }
yy7:
    yycursor = yymarker;
    goto yy2;
yy8:
    { return 0; }
yy9:
    { return 2; }
yy10:
    { return 5; }
}

}

private int lex_eof(immutable char[] str) {
    const(char)* yycursor = cast(char*)str;
    const(char)* yylimit = yycursor + str.length;
    const(char)* yymarker;

    
{
    char yych;
yyFillLabel0:
    yych = *yycursor;
    switch (yych) {
        case 'a': goto yy14;
        case 'b': goto yy15;
        case 'c': goto yy16;
        default:
            if (yylimit <= yycursor) {
                if (0) goto yyFillLabel0;
                goto yy19;
            }
            goto yy12;
    }
yy12:
    ++yycursor;
yy13:
    { return 1; }
yy14:
    ++yycursor;
    if (yycursor == yylimit) goto yy20;
    { return 3; }
yy15:
    ++yycursor;
    { return 4; }
yy16:
    yymarker = ++yycursor;
yyFillLabel1:
    yych = *yycursor;
    switch (yych) {
        case 'c': goto yy17;
        default:
            if (yylimit <= yycursor) {
                if (0) goto yyFillLabel1;
                goto yy21;
            }
            goto yy13;
    }
yy17:
    ++yycursor;
yyFillLabel2:
    yych = *yycursor;
    switch (yych) {
        case 'c': goto yy17;
        default:
            if (yylimit <= yycursor) {
                if (0) goto yyFillLabel2;
                goto yy21;
            }
            goto yy18;
    }
yy18:
    yycursor = yymarker;
    goto yy13;
yy19:
    { return 0; }
yy20:
    { return 2; }
yy21:
    { return 5; }
}

}

private int lex_scc(immutable char[] str) {
    static char[256] buf;
    char* yycursor = cast(char*)buf;
    char* end = yycursor + str.length;
    char* yylimit = end + YYMaxFill;
    char* yymarker;

    memcpy(cast(void*)buf, cast(const(void*))str, str.length);
    memset(end, 0, YYMaxFill);

    
{
    char yych;
    if (yycursor == end) goto yy30;
    if ((yylimit - yycursor) < 2) return -1;
    yych = *yycursor;
    switch (yych) {
        case 'a': goto yy25;
        case 'b': goto yy26;
        case 'c': goto yy27;
        default: goto yy23;
    }
yy23:
    ++yycursor;
yy24:
    { return 1; }
yy25:
    ++yycursor;
    if (yycursor == end) goto yy31;
    { return 3; }
yy26:
    ++yycursor;
    { return 4; }
yy27:
    yymarker = ++yycursor;
    if (yycursor == end) goto yy32;
    yych = *yycursor;
    switch (yych) {
        case 'c': goto yy28;
        default: goto yy24;
    }
yy28:
    ++yycursor;
    if (yycursor == end) goto yy32;
    if (yylimit <= yycursor) return -1;
    yych = *yycursor;
    switch (yych) {
        case 'c': goto yy28;
        default: goto yy29;
    }
yy29:
    yycursor = yymarker;
    goto yy24;
yy30:
    { return 0; }
yy31:
    { return 2; }
yy32:
    { return 5; }
}

}

private void test(immutable char[] str, int ret) {
    assert(lex_simple(str) == ret);
    assert(lex_eof(str) == ret);
    assert(lex_scc(str) == ret);
}

void main() {
    test("", 0);
    test("a", 2);
    test("ax", 3);
    test("b", 4);
    test("bx", 4);
    test("ccc", 5);
}
