Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Транслятор. ООП.

82K
26 мая 2012 года
pano
1 / / 26.05.2012
Здравствуйте, такой вопрос.
У меня транслятор есть, для простого диалогового языка(недоработан ещё) написал библиотеку для рисования в bmp. После распознавания команды initmap, в семантическом правиле создаётся экземпляр класса. НО после распознавание другой команды, скажем построения дороги, ничего не рисуется, потому что обьект уничтожается после выхода из семантического правила. Не подскажете как это побороть?


Код:
%{
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
extern int yylineno;
extern int yylex();
#include <cctype>
#include <math.h>
#include <fstream>
#include <cstdlib>
                                                                 
struct pixel {      //пиксель с тремя составляющими цвета
        unsigned char b;
        unsigned char g;
        unsigned char r;
};


class Picture {
        char signature[2];                                  //тип файла, сигнатура
        unsigned int size;                                   //размер файла в байтах
        unsigned short reserved1;                      //зарезервировано
        unsigned short reserved2;                     //зарезервировано
        unsigned int pos_of_start;                    //смещение
        char name[100];
        unsigned int size_header;//=40
        unsigned int width;  //ширина
        unsigned int height;  //высота
        unsigned short num; //число плоскостей =1
        unsigned short bit_per_pixel; //глубина цвета
        unsigned int compression;//тип сжатия
        unsigned int size_of_compression; //0 или размер сжатого изображения
        unsigned int horizontal_resolution; //0
    unsigned int vertical_resolution;  //0
        unsigned int used_color; //кол-во используемых цветов
        unsigned int main_color; //кол-во важных цветов
        pixel *pix;   //указатель не массив пикселей
        pixel color_of_pix; //цвет пикселя

        pixel set_color(int c,int r=0,int g=0,int b=0);  // установить цвет
        int tr_from_decXY(int x,int y); //перевод координат  x,y в индекс массива(координаты начинаются с нижнего левого угла рисунка точка (0,0))
        unsigned int img_size; //размер картинки
        unsigned int bit_img_size;//размер данных изображения

public:
    Picture(char *p="default",int w=200,int h=200,int color=1,int r=0,int g=0,int b=0);
        void draw();//создает рисунок (заносит всю информацию в файл)
    void put_pixel(int x=0,int y=0,int c=6,int r=0,int g=0,int b=0);//нарисовать пиксель
    void put_point(int x=0,int y=0,int c=6,int r=0,int g=0,int b=0);//нарисовать точку 2Х2 пикселей
    void line(int x1,int y1,int x2, int y2, int c=6,int r=0,int g=0,int b=0);//нарисовть линию
    void circle(int rad,int x0,int y0,int c=6,int r=0,int g=0,int b=0);//нарисовть круг с центром в точке х0,y0 и радиусом rad
    void rectangle(int x0,int y0,int w,int h,int c=6,int r=0,int g=0,int b=0);/*нарисовать прямоугольник ц центром в точке x0,y0  */
};


Picture::Picture(char *p,int w,int h,int color,int r,int g,int b)
{
  //лалала
}

void Picture::draw()
{
  //лалала
}

pixel Picture::set_color(int c,int r,int g,int b) //для установления своего цвета нужно написать 7 и три компонента цвета
{
  //лалала
}



int Picture::tr_from_decXY(int x, int y)
{
  //лалала
}

void Picture::put_pixel(int x, int y, int c, int r, int g, int b)
{
  //лалала
}


void Picture::put_point(int x, int y, int c,int r,int g,int b)
{
  //лалала  
}

void Picture::line(int x1, int y1, int x2, int y2, int c,int r,int g,int b)
{
  //лалала
}

void Picture::circle(int rad, int x0, int y0, int c,int r,int g,int b)
{
  //лалала
}

void Picture::rectangle(int x0, int y0, int w, int h, int c,int r,int g,int b)
{
  //лалала
}


    void yyerror(char *s) {
      std::cerr << s << ", line " << yylineno << std::endl;
      exit(1);
    }
     #define YYSTYPE std::string
%}

%token IF ELSE WHILE EXIT INITMAP ROAD STATION TREE
%token EQ LE GE NE
%token STRING NUM ID

%%

PROGRAM: OPS
;

OPS:    OP
|       OPS OP
;

OP1:    '{' OPS '}'
|       EXPR ';'
|   INITMAP '(' NUM  ',' NUM ')' ';'  { Picture image("C:\\image",1200,1200,1); } //тут создаётся экземпляр класса
|   ROAD '(' NUM  ',' NUM  ',' NUM  ',' NUM  ',' NUM ')'  ';' {  image.line(0,0,1199,1199,6); } // но ведь тут его уже нет, он разрушается после выхода из предыдущего семантического правила.
|   STATION '(' NUM  ',' NUM ')' ';' { std::cout << "остановка"; }
|   TREE '(' NUM  ',' NUM ')' ';' { std::cout << "дерево"; }

|       IF '(' EXPR ')' OP1 ELSE OP1
|       WHILE '(' EXPR ')' OP1
|       EXIT ';'
;

OP2:    IF '(' EXPR ')' OP
|       IF '(' EXPR ')' OP1 ELSE OP2
|       WHILE '(' EXPR ')' OP2
;

OP:     OP1 | OP2 ;

EXPR:   EXPR1
|       ID '=' EXPR

EXPR1:  EXPR2
|       EXPR1 EQ EXPR2
|       EXPR1 LE EXPR2
|       EXPR1 GE EXPR2
|       EXPR1 NE EXPR2
|       EXPR1 '>' EXPR2
|       EXPR1 '<' EXPR2
;

EXPR2: TERM
|       EXPR2 '+' TERM
|       EXPR2 '-' TERM
;

TERM:   VAL
|       TERM '*' VAL
|       TERM '/' VAL
;

VAL:    NUM
|       '-' VAL
|       '!' VAL
|       '(' EXPR ')'
|       ID
|       ID '(' ARGS ')'
;

ARGS:
|       ARG
|       ARGS ',' ARG
;

ARG:    EXPR
|       STRING
;

%%
int main() { return yyparse(); }
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог