"""Calculator lexer example."""
import ply.lex as lex

"""
Lista de tokens

El analizador léxico de PLY (al llamar al método lex.lex()) va a buscar
para cada uno de estos tokens una variable "t_TOKEN" en el módulo actual.

Sí, es súper nigromántico pero es lo que hay.

t_TOKEN puede ser:

- Una expresión regular
- Una función cuyo docstring sea una expresión regular (bizarro).

En el segundo caso, podemos hacer algunas cosas "extras", como se
muestra aquí abajo.

"""

tokens = (
    'NUMBER',
    'PLUS',
    'TIMES',
    'MINUS',
    'LEFT_PAR',
    'RIGHT_PAR',
)

t_PLUS = r'\+'
t_MINUS = r'-'
t_TIMES = r'\*'
t_LEFT_PAR = r'\('
t_RIGHT_PAR = r'\)'

"""Esta variable especial ignora estos caracteres"""
t_ignore = " \t"


def t_NUMBER(t):
    r'\d+'
    """Regla para números.

    Esta función se crea para hacer "algo más" que sólo convertir a token.

    Observar que la primer línea (!) tiene que ser un
    """
    t.value = int(t.value)
    return t

def t_newline(t):
    r'\n+'
    """
    Regla para newlines. Sólo cuenta la cantidad de estos.
    """

    t.lexer.lineno += t.value.count("\n")

def t_error(t):
    print("Illegal character '%s'" % t.value[0])
    t.lexer.skip(1)

# Build the lexer
lexer = lex.lex()


def apply(string):
    """Aplica el análisis léxico al string dado."""
    lexer.input(string)

    return list(lexer)