• Как переходить между состояниями?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вам нужно для начала расписать лексемы, построить конечный автомат и доработать его для вычисления значений лексем. Пример для алфавита [a-z0-9=], идентификаторов, целых чисел и присвоения:
    <буква> := [a-z]
    <цифра> := [0-9]
    <равно> := [=]
    <идентификатор> := <буква>(<буква>|<цифра>)*
    <число> := <цифра>(<цифра>)*
    Автомат:
    _    [a-z]  [0-9]  [=]  ¬
    s0    s1     s2    ok  end
    s1    s1     s1    ok  ok
    s2    ok     s2    ok  ok

    Доработанный автомат:
    _       in == ['a'-'z']                     in == ['0'-'9']                    in == ['=']           ¬
    s0    val := in; next; s1                 val := in-'0'; next; s2            next; ret(ASSIGN)  ret(EOT)
    s1    val := concat(val, in); next; s1    val := concat(val, in); next; s1   ret(IDENT, val)    ret(IDENT, val)
    s2    ret(INTEGER, val)                   val := val*10+in-'0'; next; s2     ret(INTEGER, val)  ret(INTEGER, val)

    s0 - исходное состояние, in - текущий символ, next - переход к следующему символу в потоке, ret возвращает тип лексемы и её значение.
    Список переходов при анализе 'a1=95':
    Первый вызов:
    s0 ('a') -> val := 'a'; next; s1
    s1 ('1') -> val := 'a1'; next; s1
    s1 ('=') -> ret(IDENT, 'a1')

    Второй вызов:
    s0 ('=') -> next; ret(ASSIGN)
    Третий вызов:
    s0 ('9') -> val := 9; next; s2
    s2 ('5') -> val := 95; next; s2
    s2 (¬) -> ret(INTEGER, 95)

    Следующие вызовы:
    s0 (¬) -> ret(EOT)
    Ответ написан