October 18, 2007
soullost
GNU/Linux, Parsing
2 Comments
Hoy me he dado un momento para empezar a usar Graphviz (http://www.graphviz.org) que es un programa para realizar gráficas. Graphviz es exactamente el mismo programa que usa Kakuy (proyecto SEPa). Kakuy es un software en windows que usa para animar (por medio de gráficas) técnicas de parsing, muy recomendado más por la extensa documentación sobre las técnicas de parsing
.
Bueno, para empezar hay que saber que Graphviz usa documentos *.dot para que por medio de dot (comando) se pueda leer la estructura de éste y se genere la gráfica correspondiente.
Un ejemplo simple:
ejemplo.dot
CODE:
-
digraph G{
-
rankdir=LR;
-
node [shape = doublecircle]; q3;
-
node [shape = circle];
-
q0 -> q1 [ label = "a" ];
-
q1 -> q2 [ label = "b" ];
-
q2 -> q3 [ label = "c" ];
-
}
Para crear un archivo *.png mediante el archivo ejemplo.dot en nuestra consola hacemos:
CODE:
-
dot -Tpng ejemplo.dot -o ejemplo.png
CODE:
-
soullost@UnderHouse ~/dots $ ls *.png
-
ejemplo1.png
La imagen:

! Ya tenemos nuestro primer autómata dibujado!
XD
La razón de usar Graphviz es porque quisiera poner más ejemplos de parsing pero no encontraba como dibujar los autómatas de una forma sencilla
, en fin puedes obtener Graphviz de:
Windows: http://www.graphviz.org/Download_windows.php
Linux: http://www.graphviz.org/Download_linux.php
Gentoo
:
Hay cosas más interesantes sobre Graphviz, por ejemplo, hay una librería para C y Python (me parece xD)..
Recomendado leer:
- PDF dot guide
Nos vemos!!..
Califica el tema:

Loading ...
July 11, 2007
root
Parsing, Programación
No Comments
No me voy a liar con conceptos y demás, entonces, miren la wikipedia:
http://es.wikipedia.org/wiki/Aut%C3%B3mata_con_pila
Claro cualquier duda también pueden dejarme un comentario y trataré de ayudarle si me es posible :).
Como repaso rápido, un autómata de pila no es más que un algoritmo que aparte de verificar un lenguaje determinado, tiene la posibilidad de poder controlar la aparición de los símbolos definidos en alfabeto de nuestro lenguaje. Para ser más práctico, un ejemplo claro de esto es en los lenguajes de programación, cuando hacemos la llamada a la instrucción if, que tiene sintaxis:
if ( condicion|comparacion ) ;
Como regla básica la instrucción if debe contener un parénesis abierto y otro cerrado, entonces, esta es la posibilidad de un autómata de pila.
Ahora les comparto el código de un programa que determina si la palabra escrita pertenece o no al siguiente lenguaje:
X^n W Y^n
Donde n>=1.
Donde la expresión mínima del lenguaje es:
Expresion a validar:
xwy
SINTAXIS CORRECTA
Las transíciones son:
1) (q0,x,#) -> (q1, )
2) (q1,x,#) -> (q1,a)
3) (q1,w,a) -> (q2, )
4) (q2,y,a) -> (q3,&)
5) (q3,y,a) -> (q3,&)
6) (q3,y,#) -> (q4, )
Más o menos, aclarar que "&" representa quitar un elemento de la pila.
Para compilar con g++:
g++ a202301.cpp -o a202301
Les dejo el código:
C++:
-
/*
-
Autor: Soul Lost
-
Descripcion: Lenguaje: x^n w y^n
-
Donde n>=1.
-
*/
-
-
-
-
#include<iostream.h>
-
-
#include<stdlib.h>
-
-
-
-
typedef char cadena[80];
-
-
enum alfabeto{x,y,w,FDC};
-
-
enum status{mal,bien};
-
-
cadena linea;
-
-
status result=mal;
-
-
alfabeto simbolo;
-
-
int pos;
-
-
char tope;
-
-
-
-
//Estructura para llevar el control de la pila
-
-
-
-
struct nodo{
-
-
char smb;
-
-
nodo* next;
-
-
};
-
-
-
-
nodo* first=NULL;
-
-
-
-
int leerCar();
-
-
int resultado();
-
-
int estado1();
-
-
int estado2();
-
-
int estado3();
-
-
int estado4();
-
-
int estado5();
-
-
int meter(char);
-
-
int sacar();
-
-
char obtener();
-
-
-
-
int main(){
-
-
pos=-1;
-
-
system("clear");
-
-
cout<<"Expresion a validar:"<<endl;
-
-
cin>>linea;
-
-
meter('#');
-
-
estado1();
-
-
resultado();
-
-
system("sleep 2");
-
-
return 0;
-
-
}
-
-
-
-
int resultado(){
-
-
if(result) cout<<"SINTAXIS CORRECTA"<<endl;
-
-
else cout<<"EXPRESION NO VALIDA"<<endl;
-
-
return 0;
-
-
}
-
-
-
-
int leerCar(){
-
-
char caracter;
-
-
pos++;
-
-
caracter=toupper(linea[pos]);
-
-
tope=obtener();
-
-
if(caracter=='X') simbolo=x;
-
-
else if(caracter=='Y') simbolo=y;
-
-
else if(caracter=='W') simbolo=w;
-
-
else if(caracter=='\0') simbolo=FDC;
-
-
return 0;
-
-
}
-
-
-
-
int estado1(){
-
-
leerCar();
-
-
if(simbolo==x && tope=='#'){
-
-
meter('a');
-
-
estado2();
-
-
}
-
-
return 0;
-
-
}
-
-
-
-
int estado2(){
-
-
leerCar();
-
-
if(simbolo==x && tope=='a'){
-
-
meter('a');
-
-
estado2();
-
-
}
-
-
else if(simbolo==w && tope=='a') estado3();
-
-
return 0;
-
-
}
-
-
-
-
int estado3(){
-
-
leerCar();
-
-
if(simbolo==y && tope=='a'){
-
-
sacar();
-
-
estado4();
-
-
}
-
-
return 0;
-
-
}
-
-
int estado4(){
-
-
leerCar();
-
-
if(simbolo==y && tope=='a'){
-
-
sacar();
-
-
estado4();
-
-
}
-
-
else if(simbolo==FDC) estado5();
-
-
return 0;
-
-
}
-
-
-
-
int estado5(){
-
-
if(tope=='#') result=bien;
-
-
delete first;
-
-
return 0;
-
-
}
-
-
-
-
int meter(char a){
-
-
nodo* nuevo = new nodo;
-
-
nuevo->smb=a;
-
-
nuevo->next=first;
-
-
first=nuevo;
-
-
return 0;
-
-
}
-
-
-
-
int sacar(){
-
-
if(first==NULL)
-
-
return 0;
-
-
if(first->next==NULL){
-
-
delete first;
-
-
}
-
-
nodo* actual=first->next;
-
-
nodo* temp=first;
-
-
first=actual;
-
-
delete temp;
-
-
return 0;
-
-
}
-
-
-
-
char obtener(){
-
-
return first->smb;
-
-
}
Automata de Pila
Califica el tema:

Loading ...
June 16, 2007
root
General, Parsing, Programación
No Comments
A que no saben qué? Llegó fin de semestre y la semana y media para los exámenes (recuperaciones, extraordinarios), por lo tanto, como soy relisto xD estuve esta semana sin navegar mucho :P.
Resumiendo las materias (copiando a la madona):
Matemáticas V: :):):):(:(:(
Teoría de la Computación: :):):):):):)
Desarrollo sustentable: :):):):):):)
IO: >:( N/A
Circuitos: :):):):):(:(
Como sea, me llevo buenos cimientos sobre analizadores sintácticos, circuitos y matemáticas xD (que realmente fueron las únicas materias rescatables). Lo bueno es que la semana que viene ya prácticamente se termino todo, dos días más para extraordinarios y se acabo
(no pregunten si me llevo extras de mate XD).
Bueno, hoy tengo mucho sueño O.o y les comparto un pequeño programa (que se puede pasar a POO y demás yerbas, pero por el tiempo encima, ps
que pasa de un gramática libre de contexto a la FNC (forma normal de chomsky) con algunas restricciones :P.
El código es:
C++:
-
/**
-
Descripcion: Convierte a forma normal de chomsky.
-
-
Ejemplo:
-
-
Gramatica:
-
A -> Ac Donde: A - Es un no terminal
-
A -> w Ac - Es la derivacion del no terminal A
-
-
Gramatica en Forma Normal de Chomsky:
-
A -> AZ
-
A -> w
-
Z -> c
-
-
Notas:
-
1) Los terminales deben ser de un solo caracter.
-
2) Como terminales acepta a-z y +,-,*,/,%,( y ).
-
3) Las derivaciones no deben contener espacios.
-
-
**/
-
-
-
-
#include<iostream.h>
-
-
#include<stdlib.h>
-
-
#include<stdio.h>
-
-
#include<string.h>
-
-
-
-
typedef char cadena[80];
-
-
-
-
struct g{
-
-
char nterminal;
-
-
cadena derivacion;
-
-
};
-
-
-
-
g gramatica[20];
-
-
g fnc[30];
-
-
-
-
int pos=0;
-
-
int pos2=0;
-
-
int convertir();
-
-
int sprReglasUnitarias();
-
-
int verificar();
-
-
int duplicidad(char,int,int);
-
-
int crear(int,char,int,int);
-
-
int eliminar(char,int);
-
-
int terminal(int,int);
-
-
int noTerminal(int,int);
-
-
-
-
int main(){
-
-
system("CLS");
-
-
-
-
cout<<"Escribe una gramatica: "<<endl;
-
-
cout<<"Para terminal: $"<<endl;
-
-
do{
-
-
cout<<"No terminal: "; cin>>gramatica[pos].nterminal;
-
-
gramatica[pos].nterminal=toupper(gramatica[pos].nterminal);
-
-
if(gramatica[pos].nterminal!='$'){
-
-
cout<<"Derivacion: "; cin>>gramatica[pos].derivacion;
-
-
pos++;
-
-
}
-
-
else{
-
-
break;
-
-
}
-
-
}while(pos<20);
-
-
-
-
system("CLS");
-
-
cout<<"La gramatica es:"<<endl;
-
-
for(int j=0; j<pos; j++){
-
-
cout<<gramatica[j].nterminal<<" -> "
-
-
<<gramatica[j].derivacion<<endl;
-
-
}
-
-
convertir();
-
-
cout<<"La gramatica en FNC:"<<endl;
-
-
for(int j=0; j<pos2; j++){
-
-
cout<<fnc[j].nterminal<<" -> "
-
-
<<fnc[j].derivacion<<endl;
-
-
}
-
-
-
-
system("PAUSE");
-
-
-
-
return 0;
-
-
-
-
}
-
-
-
-
int convertir(){
-
-
-
-
// Suprime reglas unitarias
-
-
sprReglasUnitarias();
-
-
// Verifica y da formato a la forma normal de chomsky
-
-
verificar();
-
-
return 0;
-
-
}
-
-
-
-
-
-
-
-
int sprReglasUnitarias()