# lexer.py

from string import ascii_letters, digits, whitespace

wordStart = ascii_letters + "_"
wordInner = wordStart + digits 
dualOps   = ('**','<=','==','&&','||')


def getDigit(p,prog) :
    if prog[p] in digits : return (p+1,prog[p])
    else                 : return (p,None)

def getNumber(p,prog) :
    p,dig = getDigit(p,prog)
    if dig == None : return (p,None)  # no leading digit
    number = dig
    while True :
        p,dig = getDigit(p,prog)
        if dig == None : return (p,int(number))
        number += dig         # gather ascii digits

def getWord(p,prog) :
    if prog[p] in wordStart :
        word = prog[p]
        p += 1
        while prog[p] in wordInner :
            word += prog[p]
            p += 1
        return (p,word)
    return (p,None)

def lexScan(prog) :
    prog += '$'     # eof marker
    tokens = []
    p = 0
    while True :
        while prog[p] in whitespace : p += 1
        if (prog[p] == '$') : return tokens
        p,word = getWord(p,prog)
        if word : tokens.append(word)
        else :
            p,number = getNumber(p,prog)
            if number != None : tokens.append(number)
            elif prog[p:p+2] in dualOps :
                tokens.append(prog[p:p+2])  # "**" "<=" etc
                p = p+2
            else :
                tokens.append(prog[p])
                p = p+1
    return tokens

if __name__ == "__main__" :
    import sys
    code = sys.argv[1]
    print(lexScan(code))
