#!/usr/bin/env python3

source = '1+2+3+456'

# Supporting environment

EOF = object()
START = 'ST_START'
LITERAL = 'ST_LITERAL'

class Env:
    def __init__(self, inputs):
        self.inputs = inputs
        self.i = 0
        self.saved = ''

    def curInput(self):
        if self.i == len(self.inputs):
            return EOF

        return self.inputs[self.i]

    def nextInput(self):
        self.i += 1

    def emitPlus(self):
        print('PLUS')

    def emitLiteral(self, v):
        print('LITERAL {}'.format(v))

    def save(self, c):
        self.saved += c

    def getSaved(self):
        return self.saved

    def resetSaved(self):
        self.saved = ''

env = Env(source)
curInput = env.curInput
nextInput = env.nextInput
emitPlus = env.emitPlus
emitLiteral = env.emitLiteral
save = env.save
getSaved = env.getSaved
resetSaved = env.resetSaved

state = START
digits19 = [ c for c in '123456789' ]
digits09 = [ '0' ] + digits19


# Example from slide

while True:
    c = curInput()
    if state is START:
        if c == '+':
            emitPlus()
            nextInput()
        elif c in digits19:
            save(c)
            state = LITERAL
            nextInput()
        else:
            error()
    elif state is LITERAL:
        if c in digits09:
            save(c)
            nextInput()
        else:
            emitLiteral(getSaved())
            resetSaved()
            state = START

    if c is EOF: break
