1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
# escrito por Marco Alfonso, 2004 Noviembre
# importamos los símbolos requeridos desde el módulo
from pyparsing import (
Word,
one_of,
nums,
Group,
OneOrMore,
Opt,
pyparsing_unicode as ppu,
)
# usamos las letras en latin1, que incluye las como 'ñ', 'á', 'é', etc.
alphas = ppu.Latin1.alphas
# Aqui decimos que la gramatica "saludo" DEBE contener
# una palabra compuesta de caracteres alfanumericos
# (Word(alphas)) mas una ',' mas otra palabra alfanumerica,
# mas '!' y esos seian nuestros tokens
saludo = Word(alphas) + "," + Word(alphas) + one_of("! . ?")
tokens = saludo.parse_string("Hola, Mundo !")
# Ahora parseamos una cadena, "Hola, Mundo!",
# el metodo parseString, nos devuelve una lista con los tokens
# encontrados, en caso de no haber errores...
for i, token in enumerate(tokens):
print(f"Token {i} -> {token}")
# imprimimos cada uno de los tokens Y listooo!!, he aquí a salida
# Token 0 -> Hola
# Token 1 -> ,
# Token 2-> Mundo
# Token 3 -> !
# ahora cambia el parseador, aceptando saludos con mas que una sola palabra antes que ','
saludo = Group(OneOrMore(Word(alphas))) + "," + Word(alphas) + one_of("! . ?")
tokens = saludo.parse_string("Hasta mañana, Mundo !")
for i, token in enumerate(tokens):
print(f"Token {i} -> {token}")
# Ahora parseamos algunas cadenas, usando el metodo runTests
saludo.run_tests("""\
Hola, Mundo!
Hasta mañana, Mundo !
""",
fullDump=False,
)
# Por supuesto, se pueden "reutilizar" gramáticas, por ejemplo:
numimag = Word(nums) + "i"
numreal = Word(nums)
numcomplex = numimag | numreal + Opt("+" + numimag)
# Funcion para cambiar a complejo numero durante parsear:
def hace_python_complejo(t):
valid_python = "".join(t).replace("i", "j")
for tipo in (int, complex):
try:
return tipo(valid_python)
except ValueError:
pass
numcomplex.set_parse_action(hace_python_complejo)
numcomplex.run_tests("""\
3
5i
3+5i
""")
# Excelente!!, bueno, los dejo, me voy a seguir tirando código...
|