Está en la página 1de 9

3.

ÁRBOLES GRAMATICALES
3.1
G1.

Por extensión: {ab, aab, aaab,...}


Por comprensión: {𝑎 𝑛 𝑏| 𝑛 ≥ 1 }

G2.

Por extensión: {aa, aaa,aaa,aaaa,...,ba,baa,baaa,..}


Por comprensión: {𝑎 𝑛 | 𝑛 ≥ 2 } v { 𝑎 𝑧 𝑏 𝑥 | 𝑛 ≥ 1, 𝑥 ≥ 1 }
G3

Por Extensión: {0,00,000,000,..,1,11,111,1111,...}


Por comprensión: {0 𝑛 | 𝑛 ≥ 1 } v { 1 𝑚 | 𝑚 ≥ 1 }
G4

Por Extensión: {2,21,211,2111,..,22,221,2211,...}


Por comprensión: {2 𝑛 1 𝑚 | 𝑛 > 0 , 𝑚 > 0}

3.2
{𝜆,aa,aaaa,aaaaaa,aaaaaaaa}

Gramática Producciones

𝛴 𝑇 = {𝑎} 𝛴 𝑁𝑇 = {𝑆, 𝐴} 𝑃 1 :𝑆 → 𝐴|𝜆


𝐴 → 𝑎𝑎 | 𝐴𝑎

{a,aa,aaa,aaaa, ...}

Gramática Producciones

𝛴 𝑇 = {𝑎} 𝛴 𝑁𝑇 = {𝑆, 𝐴} 𝑃 1 :𝑆 → 𝐴
𝐴 → 𝑎 | 𝐴𝑎
4. Programando un árbol

4.1 Tabla informativa

Nombre Descripción

Lenguaje de programación Java 1.8

Sistema operativo Windows 10 Home Single Language 64-bit


(10.0, Build 17763)
(17763.rs5_release.180914-1434)

Procesador Intel(R) Core(TM) i5-7300HQ CPU @


2.50GHz (4 CPUs), ~2.5GHz

Board Intel(R) HD Graphics 630

Bios InsydeH2O Version 05.11.34F.34


Memoria Ram 8192MB RAM

4.2 Código fuente

A continuación se presentan los métodos más relevantes para la construcción de la


gramática

4.2.1 initTree()

recibe la raíz como parámetro, un nivel del árbol. Este método es recursivo. Inicia con el
símbolo inicial axiomático y verifica con el método isVarNotTerminal() que sus hojas
tengan una variable terminal. En caso de tenerla crea una una nueva hoja para ese nodo
con el método createNode() y siguiente vuelve a llamar el método initTree() para realizar
la construcción del árbol.
Si la hoja es una palabra la guarda en una lista de palabras

public void initTree(Node<T> root, int level) {


level++;
for (Node<T> children : root.getChildrenList()) {
if (level <= this.level) {
if (isVarNotTerminal((String) children.getInfo())) {
createNode(children);
initTree(children, level);
} else {
listWorld.add((String) children.getInfo());
}
}
}
level--;
}

4.2.2 isVarNotTerminal()
Este metodo verifica que el dato entrante contenga una variable no terminal, si la tiene
retorna verdadero en caso contrario será una palabra y retorna falso

public boolean isVarNotTerminal(String info) {


for (VarNotTerminal varNotTerminal : listVarNotTerminal) {
if (info.contains(varNotTerminal.getVarNotTerminal())) {
return true;
}
}
return false;
}
4.2.3 createNode()
Este método recibe un nodo padre y crea sus nodos hijos. Primero se obtiene la variable no
terminal con el método getVarNotTerminal() . Luego se obtiene la lista de producciones de
la variable no terminal con el método getProduction().
Una vez obtenidos estos datos se realiza un for de la lista de la producciones que tiene la
variable no terminal. En la variable world se guarda la palabra, luego en la variable result
se guarda la palabra reemplazando la variable no terminal con su producción. Terminado
este proceso se crea el nodo hijo y se guarda en el nodo padre. Dependiendo del número
de posibles producciones de la variable no terminal se crean n nodos

public void createNode(Node<T> node) {


VarNotTerminal notTerminal = getProduction((String) node.getInfo());
String simbolNotTerminal = getVarNotTerminal((String) node.getInfo());
for (String string : notTerminal.getListProduction()) {
String world = (String) node.getInfo();
String result = world.replace(simbolNotTerminal, string);
node.addChild(new Node<T>((T)result));
}

4.2.4 getVarNotTerminal()

Este metodo recibe la información del nodo y busca la variable terminal que tiene. Esto lo
hace comparando cada carácter con la lista de variables terminales que ya están guardadas

public String getVarNotTerminal(String info) {


for (int i = 0; i < info.length(); i++) {
for (VarNotTerminal varNotTerminal : listVarNotTerminal) {
if
(varNotTerminal.getVarNotTerminal().equals(String.valueOf(info.charAt(i)))) {
return String.valueOf(info.charAt(i));
}
}
}
return info;
}

4.2.5 getProduction()
Este metodo retorna un objeto de tipo VarNotTerminal en la cual se guarda la variable no
terminal y sus correspondientes producciones.
public VarNotTerminal getProduction(String info) {
for (VarNotTerminal varNotTerminal : listVarNotTerminal) {
if (info.contains(varNotTerminal.getVarNotTerminal())) {
return varNotTerminal;
}
}
return null;
}
4.2.6 searchListWorld()

En la creación del árbol las palabra encontradas se guardaron en una lista. Este método
recibe las palabras a buscar y la busca en la lista. Retorna un mensaje de aviso informando
si la encuentra o no

public String searchListWorld(String world) {


for (String string : listWorld) {
if(world.equals(string)) {
return "La palabra existe";

}
}
return "La palara no existe";
}
4.2.7 Metodos importantes del controlador

En el controlador tenemos los siguientes metodos, que interactuan con la vista motivo por el
cual no explicare como se obtiene la información pero sí que es lo que se hace con ella.
initManagerTree():
Este método obtiene de la vista el Símbolo inicial axiomático, el conjunto de variables no
terminales y el conjunto de variables terminales. Una vez obtenido estos datos se inicia la
clase ManagerTree que es la que controla el Árbol gramatical.

addProductionRoot():
Este método busca la producción del símbolo inicial axiomático y se lo envía a
ManagerTree.init() donde se crea el nodo raíz con sus correspondientes hijos obtenidos de
su producción.
createProductions():
Este método obtiene todas las producciones y se las envía a ManagerTree.addProduction()
donde se guardan en una lista

4.2.8 Método de pintado del árbol


Esta tarea lo tiene el panel JPaneltree el cual recibe el árbol armado y procede a su
pintado
Este método recibe el nodo padre, y con el manejo de variables globales para las
coordenadas se pinta el árbol.
La variable level actúa como contador para saber cuantos niveles se ha ingresado en el
árbol para así poder dibujar las líneas que conectan a los nodos.

public void paint(Graphics g, Node<String> node) {


g.setColor(Color.BLACK);
g.drawString(node.getInfo(),x,y);
level++;
for (Node<String> chlidren : node.getChildrenList()) {
g.setColor(Color.GREEN);
g.drawLine(x, y, x + x_int, y + y_int);
g.drawLine(x, y, x, y_int*level);
x = x+x_int;
y = y+y_int;
paint(g, chlidren);
}
x = x-x_int;
level--;

4.3 video
Link del video:
Archivo de codigo fuente en los anexos

También podría gustarte