#!/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 \n"