# Generated by re2py
# re2py $INPUT -o $OUTPUT



def lex_simple(yyinput):
    yycursor = 0
    yymarker = 0
    yylimit = len(yyinput) - 1
    
    yystate = 0
    while True:
        match yystate:
            case 0:
                if yylimit <= yycursor:
                    yystate = 7
                    continue
                yych = yyinput[yycursor]
                yycursor += 1
                if yych <= 0x60:
                    yystate = 1
                    continue
                if yych <= 0x61:
                    yystate = 3
                    continue
                if yych <= 0x62:
                    yystate = 4
                    continue
                if yych <= 0x63:
                    yystate = 5
                    continue
                yystate = 1
                continue
            case 1:
                yystate = 2
                continue
            case 2:
                return 1
            case 3:
                if yylimit <= yycursor:
                    yystate = 8
                    continue
                return 3
            case 4:
                return 4
            case 5:
                yymarker = yycursor
                if yylimit <= yycursor:
                    yystate = 9
                    continue
                yych = yyinput[yycursor]
                if yych != 0x63:
                    yystate = 2
                    continue
                yycursor += 1
                yystate = 6
                continue
            case 6:
                if yylimit <= yycursor:
                    yystate = 9
                    continue
                yych = yyinput[yycursor]
                if yych == 0x63:
                    yycursor += 1
                    yystate = 6
                    continue
                yycursor = yymarker
                yystate = 2
                continue
            case 7:
                return 0
            case 8:
                return 2
            case 9:
                return 5
            case _:
                raise "internal lexer error"


def lex_eof(yyinput):
    yycursor = 0
    yymarker = 0
    yylimit = len(yyinput) - 1
    
    yystate = 0
    while True:
        match yystate:
            case 0:
                yych = yyinput[yycursor]
                if yych <= 0x61:
                    if yych <= 0x00:
                        if yylimit <= yycursor:
                            if False:
                                yystate = 0
                                continue
                            yystate = 8
                            continue
                        yycursor += 1
                        yystate = 1
                        continue
                    if yych >= 0x61:
                        yycursor += 1
                        yystate = 3
                        continue
                    yycursor += 1
                    yystate = 1
                    continue
                else:
                    if yych <= 0x62:
                        yycursor += 1
                        yystate = 4
                        continue
                    if yych <= 0x63:
                        yycursor += 1
                        yystate = 5
                        continue
                    yycursor += 1
                    yystate = 1
                    continue
            case 1:
                yystate = 2
                continue
            case 2:
                return 1
            case 3:
                if yycursor == yylimit:
                    yystate = 9
                    continue
                return 3
            case 4:
                return 4
            case 5:
                yymarker = yycursor
                yych = yyinput[yycursor]
                if yych <= 0x00:
                    if yylimit <= yycursor:
                        if False:
                            yystate = 5
                            continue
                        yystate = 10
                        continue
                    yystate = 2
                    continue
                if yych != 0x63:
                    yystate = 2
                    continue
                yycursor += 1
                yystate = 6
                continue
            case 6:
                yych = yyinput[yycursor]
                if yych <= 0x00:
                    if yylimit <= yycursor:
                        if False:
                            yystate = 6
                            continue
                        yystate = 10
                        continue
                    yystate = 7
                    continue
                if yych == 0x63:
                    yycursor += 1
                    yystate = 6
                    continue
                yystate = 7
                continue
            case 7:
                yycursor = yymarker
                yystate = 2
                continue
            case 8:
                return 0
            case 9:
                return 2
            case 10:
                return 5
            case _:
                raise "internal lexer error"


YYMAXFILL = 2


def lex_scc(str):
    yyinput = str + (b"\0" * YYMAXFILL)
    yycursor = 0
    yylimit = len(yyinput)
    end = len(str) - 1
    
    yystate = 0
    while True:
        match yystate:
            case 0:
                if yycursor == end:
                    yystate = 7
                    continue
                if (yylimit - yycursor) < 2:
                    return -1
                yych = yyinput[yycursor]
                yycursor += 1
                if yych <= 0x60:
                    yystate = 1
                    continue
                if yych <= 0x61:
                    yystate = 3
                    continue
                if yych <= 0x62:
                    yystate = 4
                    continue
                if yych <= 0x63:
                    yystate = 5
                    continue
                yystate = 1
                continue
            case 1:
                yystate = 2
                continue
            case 2:
                return 1
            case 3:
                if yycursor == end:
                    yystate = 8
                    continue
                return 3
            case 4:
                return 4
            case 5:
                yymarker = yycursor
                if yycursor == end:
                    yystate = 9
                    continue
                yych = yyinput[yycursor]
                if yych != 0x63:
                    yystate = 2
                    continue
                yycursor += 1
                yystate = 6
                continue
            case 6:
                if yycursor == end:
                    yystate = 9
                    continue
                if yylimit <= yycursor:
                    return -1
                yych = yyinput[yycursor]
                if yych == 0x63:
                    yycursor += 1
                    yystate = 6
                    continue
                yycursor = yymarker
                yystate = 2
                continue
            case 7:
                return 0
            case 8:
                return 2
            case 9:
                return 5
            case _:
                raise "internal lexer error"


def test(str, ret):
    if lex_simple(str) != ret: raise "error simple"
    if lex_eof(str) != ret: raise "error eof" + lex_eof(str) + ret
    if lex_scc(str) != ret: raise "error scc"

test(b"\0", 0)
test(b"a\0", 2)
test(b"ax\0", 3)
test(b"b\0", 4)
test(b"bx\0", 4)
test(b"ccc\0", 5)
