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_error( t):
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