5. Otro ejemplo de Analizador sintactico

 import ply.lex as lex


# resultado del analisis
resultado_lexema = []

reservada = (
    
    
    # Palabras Reservadas
    'IF',
    'ELSE',
    'FINALLY',
    'NAMESPACE',
    'PRINT',
    
)


tokens = reservada + (
    
   #OPERACIONES ARITMETICOS 
    'SUMA',
    'RESTA',
    'MULT',
    'DIV',
    'POTENCIA',
    'MODULO',



    #CONDICIONES Y CICLOS
   'SI',
    'SINO',
   'MIENTRAS',
   'PARA',
   
   
   
    #OPERACIONES LOGICOS: 
    'AND',
    'OR',
    'NOT',
    'MENORQUE',
    'MENORIGUAL',
    'MAYORQUE',
    'ENTRE OTROS'
    
)


# EXPRESIONES PARA TOKENS

t_SUMA = r'\+'
t_RESTA = r'-'
t_MULT = r'\*'
t_DIV = r'/'
t_POTENCIA = r'(\*{2} | \^)' #PARA POTENCIA REPRESENTA DOS MANERAS PARA CALCULAR 
#ESTA NUM * {2} Y NUM ^ NUM
t_MODULO = r'\%'



# DECLARACIONES DE EXPRESIONES LOGICAS

t_AND = r'and'
t_OR = r'or'
t_NOT = r'\!'
t_MENORQUE = r'<'
t_MAYORQUE = r'>'
t_MENORIGUAL = r'<='


'''
RETORNAMOS LAS PALABRAS RESERVADAS 
++++++++++ PALABRAS RESERVADAS+++++++
''' 

def t_IF(t):
    r'if'
    return t

def t_ELSE(t):
    r'else'
    return t

def t_FINALLY(t):
    r'finally'
    return t

def t_NAMESPACE(t):
    r'NAMESPACE'
    return t

def t_PRINT(t):
    r'print'
    return t

'''
RETORNO DE ++++CONDICIONES Y CICLOS++++
'''
def t_SINO(t):
    r'else'
    return t

def t_SI(t):
    r'if'
    return t

def t_MIENTRAS(t):
    r'while'
    return t

def t_PARA(t):
    r'for'
    return t


'''
RETURN ++++ OPERACIONES LOGICOS++++
'''
def t_AND(t):
    r = 'and'

def t_OR(t):
    r = 'or'

def t_NOT(t):
    r = 'not'

def t_MENORQUE(t):
    r = '<'

def t_MENORIGUAL(t):
    r'<='
    return t

def t_MAYORQUE(t):
    r'>'
    return t

def t_ENTRE_OTROS(t):
    r'< , > , <= , => , ! , == , &'
    return t



'''
EN ESTE CASO ES MUY IMPORTANTE USAR, DECLARAR LOS METODOS DE 
COMETARIOS DE LINEA TANTO MULTIPLES LINEAS EN PYTHON
++++ VEAMOS EL EJEMPLO+++++
'''

def t_Saltoline(t):
    r'\n+'
    t.lexer.lineno += len(t.value)
print ("Salto de linea en consola")


def t_comments(t):
    '''
   r =  MULTIPLES LINEAS    
    '''
    r'' 
    t.lexer.lineno += t.value.count('\n')
    print("Comentario de multiple linea")

def t_comments_ONELine(t):
     r'#'
     t.lexer.lineno += 1
     print("Comentario de una linea")
t_ignore =\t'

#MOSTRANDO ERRORES SI HAY EN EL TOKENS

def t_errort):
    global resultado_lexema
    estado = "** Token no valido en la Linea {:4} Valor {:16} Posicion {:4}".format(str(t.lineno), str(t.value),
                                                                      str(t.lexpos))
    resultado_lexema.append(estado)
    t.lexer.skip(1)



# PRUEBA DE INGRESO

def prueba(data):
    global resultado_lexema

    analizador = lex.lex()
    analizador.input(data)

    resultado_lexema.clear()
    while True:
        tok = analizador.token()
        if not tok:
            break
        # print("lexema de "+tok.type+" valor "+tok.value+" linea "tok.lineno)
        estado = "Linea {:4} Tipo {:16} Valor {:16} Posicion {:4}".format(str(tok.lineno),str(tok.type) ,str(tok.value), str(tok.lexpos) )
        resultado_lexema.append(estado)
    return resultado_lexema


 # INTANCIAMOS EL ANALIZADOR SINTACTICO
 
analizador = lex.lex()

if __name__ == '__main__':
    while True:
        data = input("ingrese: ")
        prueba(data)
        print(resultado_lexema)





NOTA: PROGRAMA INCOMPLETO