LINUX.ORG.RU

Создание Компиляторов:программа проверки типов


0

0


email: art_copr@list.ru

Проблема в следующем: требуется написать программу проверки типов.
в книге Ахо,Сети,Ульмана "Компиляторы - Принципы,Технологии,инструменты" написана глава "Идентификация типов", но законченных примеров там нет (или скорее всего я плохо искал).

Написана программа проверки должна быть для bison грамматики.

Хотел написать по примеру 6.1:

Конструктор типа Кодирование

pointer 01
array 10
function_return 11


Конструктор типа Кодирование

boolean 0000

char 0001

integer 0010

real 0011

Результат:

Выражение типа Код

char 000000 0001

function_return(char) 000011 0001

pointer(function_return(char) 000111 0001


array(pointer(function_return(char) 100111 0001

Для примера что - то типа такого кода есть в tiny c compiler (tcc)

Вопрос: как реализовать это под bison:

%token ARRAY

%token POINTER

%token F_RETURN

%token REAL

%token CHAR

%token BOOLEAN

у кого какие предложения?

код пишется на с++ хотелось бы реализовать всю проверку ввиде класса

который является членом класса CParser (уже написан).

CParser
{
public:

....

const int Run () const{ return yyparse ();}


const int call_function (const char* lpszName,параметры вызова)
{

symrec* pSym = (*pSymTable)[lpszName];

/* здесь вызов проверки типов */

return VOID_TYPE;

}

....

protected: CSymTable* pSymTable;

указатель на класс проверки типов;

};

Почитать книжку Хантера "Основы построения компиляторов" (кажется название такое, мог и преврать), и написать что надо:)

kiv
()
Ответ на: комментарий от kiv

С удовольствием прочитал бы (если бы была в продаже у меня в городе а пока только эту нашел + скачал gcc (много макросов + грамматика мне нужна паскалевская) + harbour( скорее всего отсюда чего-нибудь сдеру хотя там макро язык встроен в лексику + макросы кругом (макрос на макросе макросом погоняет )) + free pascal + gnu pascal + ml(*.y написан тоже на ml поэтому тяжеловато для понимания (скачал хелп на анг. по ml а с англ. я не очень дружу))).

А проблема в том как грамматику бизона -

%defines

%token INTEGER //(в *.tab.h #define INTEGER xxx, где xxx например 200)

переделать так например (INTEGER 00 см. выше код из примера 6.1)

тогда можно было бы сравнивать по маске xx00 для определения например того что это функция а не указатель(в Ахо,Сети и т.д. используется для быстрого определения (если я правильно все понял) т.е 1000 первая 1 говорит что это функция а последнии 00 что например возврашает INTEGER и так далее (вроде через рекурсию проверка на соответствие базовых типов - (псевдокод) x( type1, type2) { if ((type1 == type2) && (type1 - базовый тип и type2 - базовый тип) ... x (type1.type1,type2.type1); ... } ) ).

вообщем что-то в этом роде.

Вообще что-нибудь об идентификации типов почитал ( кидайте на art_corp@list.ru ).Или ссылки на сайты.

art_corp
() автор топика
Ответ на: комментарий от art_corp

> %token INTEGER //(в *.tab.h #define INTEGER xxx, где xxx например 200) переделать так например (INTEGER 00 см. выше код из примера 6.1)

Ну, типа, так и будет:

%token INTEGER 200

только будьте крайне осторожны. info bison говорит: "It is generally best to let Bison chose the numeric codes for all token types". Я бы рекомендовал завести отдельную таблицу...

vnp
()

Ну не извращение ли - тип проверять на этапе парсинга?!? Это при втором проходе компиляции обычно делается - сначала получаем ТУПО AST, потом - расставляем всем выражениям типы, разименования делаем, и т.п., потом - оптимизации, требующие тип, и потом - забываем типы и генерим код.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.