Skip to content

Instantly share code, notes, and snippets.

@heptorsj heptorsj/bnf.rb
Last active Oct 26, 2017

Embed
What would you like to do?
Programa que obtiene el arbol de una expresión aritmetica.
# sea expr una expresion aritmetica obtener su arbol de notación infija
@arboles = 0
def centraarbol(n)
for i in 1..n
print " "
end
end
def imprime_raices(sarbol)
centraarbol(@arboles)
print sarbol[1][0]
centraarbol(@arboles*2)
print sarbol[2][0]
end
def imprime(arbol)
imprime_raices(arbol)
if arbol[1].length > 1
puts ""
@arboles = @arboles - 2
imprime_raices(arbol[1])
if arbol[2].length > 1
centraarbol(@arboles*3)
imprime_raices(arbol[2])
puts ""
else
end
else
print arbol
return 0
end
end
def imprimearbol(arbolpapu)
arbol = []
arbolpapu.each do |nodo|
arbol.push(nodo[0])
arbol.push(nodo[1])
arbol.push(nodo[2])
end
print arbol
puts ""
centraarbol(@arboles * 2)
puts arbol[0]
centraarbol(@arboles)
print "|"
centraarbol(@arboles*2)
print "|"
puts ""
imprime(arbol)
end
# metodo que arma un subarbol
# [raiz,rama_izquierda,rama_derecha]
def armasubarbol(n,s)
operadores_unarios = ["raiz","sen","cos"]
raiz = n.pop() # la raiz se obtiene de la pila de operadores
if (operadores_unarios.include? raiz)
b = s.pop() # si es unario solo va a tener una rama
a = []
else
a = s.pop()
b = s.pop()
end
return [raiz,b,a]
end
def obtenerarbol(expr)
operadores = ["+","-","/","*"] # Ejemplo de algunos operadores binarios
operadores_unarios = ["raiz","sen","cos"] # Ejemplo de algunos operadores unarios
n = [] # pila de operadores
s = [] # pila de operandos
e = expr.split() # obtenemos cada carcater de la expresion
e.each do |c| # iteramos sobre cada caracter
if c == "("
#ignorar
elsif c == ")"
s1 = armasubarbol(n,s) # obtenemos un nodo
s.push(s1) # lo guardamos en la misma pila que los operandos
@arboles += 1
else
if operadores.include? c # si el caracter es operador lo almacenamos en su respectiva pila
n.push(c)
else
s.push(c)
end
end
end
return s
end
arbol = obtenerarbol("( ( ( 9 * 3 ) - 5 ) * ( 2 + 1 ) )")
imprimearbol(arbol)
puts ""
# cada sub arbol esta compuesto de [raiz,term1,term2]
# donde termi puede ser o un operador o un numero
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.