All pastes #20035 Raw Edit

tigrux 1

public text v1 · immutable
#20035 ·published 2005-08-15 03:53 UTC
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"