Page 1

MANUAL JFLEX Y BISON CON QT Universidad de San Carlos de Guatemala Ingenieria en Ciencias y Sistemas Escuela de Ciencias y Sistemas Organización de Lenguajes y Compiladores 1 Aux. Aura Cifuentes y Wendy Arrecys

Septiembre del 2011

HERRAMIENTAS:     

C/C++ QT FRAMEWORK QTCREATOR IDE FLEX BISON


PASO 1: Creaci贸n de un nuevo proyecto

Crearemos un proyecto llamado ejemplo con su clase principal llamada ejemplo.


Por defecto nos crea:   

ejemplo.cpp ejemplo.h ejemplo.ui

Procederemos a crear:    

library.h library.cpp myscene.cpp myscene.h

Estas 2 clases nos ayudaran a crear la manipulación de gráficos, myscene se utilizara para mostrar lo grafico y library contiene los elementos a utilizar en la escena.


Este proceso se repetir谩 para la creaci贸n de Myscene y library

Creamos: Myscene

Creamos: library

Myscene.h (HEADER): #ifndef MYSCENE_H #define MYSCENE_H #include <QGraphicsView> #include <QDragEnterEvent> #include <QDropEvent> #include <QDragMoveEvent> #include <iostream> #include "library.h" class Myscene :public QGraphicsView{ public: Myscene(QGraphicsScene * scene, QWidget *parent=0); library* lib;


int x; int y; void setSize(int x, int y); void dib_imagenes(QString path,int x, int y); protected: void dragEnterEvent(QDragEnterEvent * event); void dragMoveEvent(QDragMoveEvent * event); void dropEvent(QDropEvent *event); }; #endif // MYSCENE_H

Myscene.cpp (CPP): #include "myscene.h" void Myscene::dragEnterEvent(QDragEnterEvent * event){ event->acceptProposedAction(); } void Myscene::dragMoveEvent(QDragMoveEvent * event){ event->acceptProposedAction(); } void Myscene::dropEvent(QDropEvent * event){ QString n1=event->mimeData()->text(); if(n1=="casita"){ scene()->addItem(lib->crearimagen("image/casita.png",mapToScene(event->pos()))); }else{ scene()->addItem(lib->crearimagen("image/carita.png",mapToScene(event->pos()))); } } void Myscene::setSize(int x, int y){ this->x=x; this->y=y; } Myscene::Myscene(QGraphicsScene * scene, QWidget *parent):QGraphicsView(scene, parent){ setAcceptDrops(true); lib=new library(); } void Myscene::dib_imagenes(QString path,int x, int y){ float fx=this->x/20*x; float fy=this->y/20*y; scene()->addItem(lib->crearimagen(path,QPointF(fx,fy))); }

library.h


#ifndef LIBRARY_H #define LIBRARY_H #include <QGraphicsPixmapItem> #include <QGraphicsTextItem> class library { public: library(); QGraphicsPixmapItem* crearimagen(QString imagen_path,QPointF pos); }; #endif // LIBRARY_H

library.cpp #include "library.h" library::library() { } QGraphicsPixmapItem* library::crearimagen(QString imagen_path, QGraphicsPixmapItem *imagen1=new QGraphicsPixmapItem (); QPixmap q (imagen_path); imagen1->setPos(pos); imagen1->setPixmap(q); return imagen1; } AHORA PROCEDEREMOS A CREAR LA INTERFAZ GRAFICA:

QPointF pos){

Nos ubicaremos en: ď&#x201A;ˇ

ejemplo.ui

A partir de este, crearemos QTextEdit, QListWidget, QFrame, QPushButton


#ifndef EJEMPLO_H #define EJEMPLO_H #include <QMainWindow> #include <QListWidget> #include <QDrag> #include <QMimeData> #include <QPixmap> #include <QGraphicsScene> #include "myscene.h" namespace Ui { class ejemplo; } class ejemplo : public QMainWindow { Q_OBJECT public: explicit ejemplo(QWidget *parent = 0); ~ejemplo(); Myscene* es; Ui::ejemplo *ui; public slots: void seleccionado(QListWidgetItem* imag); }; #endif // EJEMPLO_H


#include "ejemplo.h" #include "ui_ejemplo.h" ejemplo::ejemplo(QWidget *parent) : QMainWindow(parent), ui(new Ui::ejemplo) { ui->setupUi(this); QObject::connect(ui->listWidget, SIGNAL(itemPressed(QListWidgetItem*)), this, SLOT(seleccionado(QListWidgetItem*))); new QListWidgetItem(QIcon("image/casita.png"),tr("casita"), ui->listWidget); new QListWidgetItem(QIcon("image/carita.png"),tr("carita"), ui->listWidget); ui->listWidget->setAcceptDrops(true); QGraphicsScene * scene1=new QGraphicsScene(); scene1->setSceneRect(0, 0, 500, 500); es=new Myscene(scene1 ,ui->frame); es->resize(375,250); es->setSize(500,500); } void ejemplo::seleccionado(QListWidgetItem* imag){ QDrag *drag=new QDrag(this); QMimeData *data=new QMimeData; data->setText(imag->text()); drag->setMimeData(data); if(imag->text().operator ==("casita")) drag->setPixmap(QPixmap("image/casita.png")); else if(imag->text().operator ==("carita")) drag->setPixmap(QPixmap("image/carita.png")); drag->exec(); } ejemplo::~ejemplo()


{ delete ui; } Ejecutamos el proyecto

Y nos darรก la ubicaciรณn donde se ha creado el ejecutable del proyecto, en mi caso utilice una path relativa por lo que lo pegare las imรกgenes en este lugar. /home/lucita/proyecto/ejemplo-build-desktop/


Ahora crearemos el parser para ello crearemos los archivos

Crearemos los archivos ď&#x201A;ˇ lexer.l ď&#x201A;ˇ parser.y

Creamos: parser.y

parser.y %{ #include "scanner.h" #include "myscene.h" #include <iostream>

Creamos: lexer.l


#include <QString> extern int yylineno; extern int columna; extern char *yytext; int yyerror(const char* mens) { std::cout <<mens<<" "<<yytext<< std::endl; return 0; } Myscene* escena; void setEscena(Myscene* es) { escena=es; } int convertInt(QString val){ bool ok; return val.toInt(&ok, 10); } %} %union{ char STR [256]; } %token<STR> Niden %token<STR> Nnum %token<STR> Ncarita %token<STR> Ncasita %token<STR> Nparen %token<STR> Ncparen %token<STR> Ncoma %token<STR> Npcoma %% S: Lista { std::cout<<"fin"<<std::endl; }; Lista: Lista K | K; K : Ncarita Nparen Nnum Ncoma Nnum Ncparen Npcoma { escena->dib_imagenes("image/carita.png",convertInt($3),convertInt($5)); } |Ncasita Nparen Nnum Ncoma Nnum Ncparen Npcoma { escena->dib_imagenes("image/casita.png",convertInt($3),convertInt($5)); } |error; %%

lexer.l %option noyywrap %{


#include "parser.h" #include <iostream> #include <QString> int columna=0; %} letra [a-zñA-ZÑ] digito [0-9] iden {letra}+ Numero {digito}+ %% "carita" { columna=columna+strlen(yylval.STR); strcpy(yylval.STR, yytext); return Ncarita; } "casita" { columna=columna+strlen(yylval.STR); strcpy(yylval.STR, yytext); return Ncasita; } [(] { columna=columna+strlen(yylval.STR); strcpy(yylval.STR, yytext); return Nparen; } [)] { columna=columna+strlen(yylval.STR); strcpy(yylval.STR, yytext); return Ncparen; } [,] { columna=columna+strlen(yylval.STR); strcpy(yylval.STR, yytext); return Ncoma; } [;] { columna=columna+strlen(yylval.STR); strcpy(yylval.STR, yytext); return Npcoma; } {iden} { columna=columna+strlen(yylval.STR); strcpy(yylval.STR, yytext); return Niden; } {Numero} { columna=columna+strlen(yylval.STR); strcpy(yylval.STR, yytext); return Nnum; } [[:blank:]] { /*Se ignoran los espacios en blanco */ } . { std::cout <<yytext<<" Error Lexico "<< std::endl; } %%

Ahora vamos a una consola y compilamos nuestros archivos:

lucita@lucita287:~/proyecto$ cd ejemplo lucita@lucita287:~/proyecto/ejemplo$ flex --header-file=scanner.h -o scanner.cpp lexer.l lucita@lucita287:~/proyecto/ejemplo$ bison -o parser.cpp --defines=parser.h parser.y

Agregamos los archivos al proyecto  scanner.cpp  scanner.h  parser.cpp  parser.h


Ahora procederemos a agregar un evento al bot贸n compilar posteriormente uniremos el analizador con la interfaz. Sobre el bot贸n compilar le damos clic secundario, y nos desplegara un men煤 desplegable en el cual seleccionamos go to slot.


ď&#x201A;ˇ

Seleccionamos el evento Clicked


Nos agregara el evento

ejemplo.h Agregamos despuĂŠs de los include: #include <stdio.h> #include <stdlib.h> #include <QFile> #include <QTextStream> extern int yyrestart( FILE* archivo); extern int yyparse(); extern void setEscena(Myscene* es);


ejemplo.cpp void ejemplo::on_pushButton_clicked() { QFile file("temp.txt"); if ( file.open( file.WriteOnly ) ) { QTextStream stream1( &file ); stream1 << ui->textEdit->toPlainText(); } const char* x = "temp.txt"; FILE* input = fopen(x, "r" ); yyrestart(input); setEscena(this->es); yyparse(); } Finalizando ya podremos ejecutar el proyecto


Que librerías puedes utilizar?  

Help/Ayuda Qt Reference Documentation


Algunos elementos recomendados:    

QGraphicsPixmapItem QGraphicsEllipseItem QGraphicsPolygonItem QGraphicsRectItem

Entre otros.

Necesitas una lista?

manual_jflex_y_bison_con_qt  

manual de qt

Read more
Read more
Similar to
Popular now
Just for you