rendered paste body#!/usr/bin/env python
from pyparsing import *
priToken=Literal("principal")
escToken=Literal("escribir")
leeToken=Literal("leer")
siToken=Literal("si")
paraToken=Literal("para")
tonsToken=Literal("tons")
sinoToken=Literal("sino")
hastaToken=Literal("hasta")
saltoToken=Literal("salto")
#definimos la gramatica bnf
ident= Word(alphas,alphanums)
opcomp = oneOf("== <> < > >= <=")
oplog = oneOf(".Y. .O.")
oparit = oneOf("+ - / *")
opcion = Word(nums) ^ ident
condicion = '(' + opcion +opcomp + opcion + ')'
condiciones = condicion ^ (condicion + oplog + condicion)
operacion = (Word(nums)^ ident) + oparit + (Word(nums) ^ ident)
operaciones = operacion + oparit + operacion
expresion = ( '\'' + Word(alphas,max=1) + '\'' ) ^ ( '\'' + Word(alphanums) \
+ '\'' ) ^ operacion ^ opcion
cadena= sglQuotedString
#Word(alphanums) + ZeroOrMore (White()+ Word(alphanums))
opci = cadena ^ ident
opci2 = opci ^ (opci + ',' + opci)
opci3 = opci2 ^ (opci2 + ',' + opci2)
opciones= opci3 ^ ZeroOrMore(opci3 + ',' + opci3)
#opci ^ opci2 ^ (opci +',' + opci2)^ (opci2 + opci2)
#funciones
sentencias=Forward()
lectura = leeToken + '(' + ident + ');'
escritura = escToken + '(' + opciones + ');'
para = paraToken + ident + '=' + opcion + hastaToken\
+ opcion + Optional(saltoToken + opcion) + '{' \
+ sentencias + '}'
si = siToken + condiciones + tonsToken + '{' \
+ sentencias + '}'\
+ Optional(sinoToken + '{' + sentencias + '}')
asigna = ident + '=' + expresion + ';'
sentencia= escritura ^ asigna ^ si ^ para ^ lectura
sentencias << sentencia + ZeroOrMore(sentencias)
programa = priToken + '{' + sentencias + '}'
#Programa Principal
def sintactico(token):
""" Tokens
"""
# print str (token)
variables=[]
for i in range(len(token)):
if token[i]=="=":
variables.append(token[i-1])
print str (variables)
return
if __name__=="__main__":
# file=raw_input("Nombre de Archivo:")
if len(sys.argv)==2:
file = sys.argv[1]
try:
tokens=programa.parseFile(file)
for i in range(len(tokens)):
print "Token %d ==> %s" % (i, tokens[i])
sintactico(tokens)
except ParseException, err:
print err.line
print ""*(err.lineno-1)
print " "*(err.column-1) + "^"
print err
#print err.line
#print " "*err.loc + "^\n" + err.msg
#print err
else:
print "\n AnaLexSi v0.1\nUsar: analexsi.py <nombre_de_archivo>\n"