amarao (amarao_san) wrote,
amarao
amarao_san

Конечные автоматы на питоне

Сделайте меня не делал!

Я знаю, си сожрал мне мозг, а императивный ассемблер - позвоночник.

Задача - выковырять query из строки. query в фигурных скобках. \ - эскейпинг.

Я точно знаю, что можно более питонисто, но не понимаю как. В гугле по python finite state machine и python syntax parsing только статьи о том, как это делает сам питон.

Парсер:

def split_on_queries(line):
    '''
        Split line to list of 'normal' strings
        and jpath queries, queries are cleaned from braces
        Input:
            junk{.foo}trash{.bar}garbage
        Output:
            [ {'str':'junk'}, {'jpath':'.foo'}, {'str':'trash'}, {'jpath':'bar'}, {'str':'garbage']

        '\\' is '\', '\(anycharacter)' is that character
        unescaped '{expression}' is jpath expression
        rest is just strings

    '''

    # finite state machine goes here, faster implementation welcomed
    # states: None - normal text
    # '{' - inside jpath
    # '\' - inside escaping
    output = []
    buf = ""
    state = None
    for c in line:
        if state is None:
            if c == '{':
                if len(buf) > 0:
                    output.append({'str':buf})
                buf = ""
                state = '{'
                continue
            if c == '\\':
                state = '\\'
                continue
            buf += c
            continue
        elif state == '{':
            if c == '}':
                output.append({'jpath':buf})
                buf = ""
                state = None
                continue
            else:
                buf += c
        elif state == '\\':
            buf += c
            state = None
            continue
    if len(buf) > 0 and state is None:
        output.append({'str':buf})

    return output


Если в течение получаса не будет ответа, код уйдёт на гитхаб, а бог убъёт котёнка.

Спасите котёнка!

UPD: Пока котёнок истекает кровью, единственное, что я придумал - это заменить output/return на yield.
Tags: python
Subscribe

  • План действий

    AAA при логине ведёт себя по разному в зависимости от того A это или AAAA.

  • Админский гольф

    Вам выдали шелл на сервер, на котором кто-то удалил все симлинки (т.е. файлы типа "симлинк"). Ваша задача починить сервер. Починенным сервер…

  • продолжая leetcode

    Первый раз я ощутил Силу. Задача - roman numerals, с обещанием, что на входе нет мусора. pub fn roman_to_int(s: String) -> i32 { let mut acc =…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 13 comments

  • План действий

    AAA при логине ведёт себя по разному в зависимости от того A это или AAAA.

  • Админский гольф

    Вам выдали шелл на сервер, на котором кто-то удалил все симлинки (т.е. файлы типа "симлинк"). Ваша задача починить сервер. Починенным сервер…

  • продолжая leetcode

    Первый раз я ощутил Силу. Задача - roman numerals, с обещанием, что на входе нет мусора. pub fn roman_to_int(s: String) -> i32 { let mut acc =…