С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Havana
95 / 4 / 0
Регистрация: 04.12.2015
Сообщений: 19
#1

Таблица символов для компилятора - C++

10.07.2016, 16:54. Просмотров 748. Ответов 9

Делаю простой компилятор и что-то зависла на вопросе о том, как хорошо реализовать таблицу символов. Реализовать в виде класса, где в качестве поля используется, скажем, вектор, в который добавляются символы. При этом, чтобы такая таблица была одна, и другие классы, представляющие структуру языка (Variable, Constant) могли к ней обращаться. Думала о реализации Одиночки, но не очень хорошо понимаю, каким образом его реализовать (раньше не делала). С другой стороны, если использовать Одиночку, получится ли тогда реализовать, кроме этой основной таблицы, локальные таблицы символов для функций в исходном языке? В общем, что-то я совсем запуталась, натолкните на мысль, пожалуйста!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2016, 16:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Таблица символов для компилятора (C++):

Макрос для определения компилятора(С++) - C++
Есть ли такое в природе?Что б можно было допустим, отличать майкрософтский от борландского внутри исходника.

Господа, подскажите исходники компилятора для С++ написанного на С++ - C++
Господа, подскажите исходники компилятора для С++ написанного на С++. Главное чтобы была корректная поддержка WinAPI и OpenGL ...

Опции компилятора - C++
Скажите пожалуйста, как можно проверить опции компилятора (с помощью макросов). Какие опции нужно проверять? Компилятор visual studio....

Внедрение компилятора - C++
Собираюсь создать свой игровой движёк в стиле Quest3D или Uniti3D. На данный момент самый простой, но задача в том что нужен компилятор...

Ошибка компилятора - C++
Всем привет) У меня такая вот проблема с компилятором Сначала всё шло хорошо. Потом стала выкидывать ошибку. Пробовал и винду менять,...

Ошибка компилятора C2600 - C++
Здравствуйте. Такая ошибка:"c:\my documets\visual studio 2013\projects\step4\step4\step4.cpp(93): error C2600: CMainWnd::~CMainWnd: нельзя...

9
nonedark2008
934 / 673 / 148
Регистрация: 28.07.2012
Сообщений: 1,837
10.07.2016, 21:17 #2
Цитата Сообщение от Havana Посмотреть сообщение
как хорошо реализовать таблицу символов
Поподробнее, что за таблица?
Что за символы в ней?
Это относится к части синтаксического анализа или уже что-то другое?
0
Havana
95 / 4 / 0
Регистрация: 04.12.2015
Сообщений: 19
10.07.2016, 22:58  [ТС] #3
на данный момент реализация такова: выполняется проход по строке, выделяются токены, в зависимости от типа токена создается соответствующий объект (Variable, Constant, MathOperator...). В таблицу символов должны попадать константы и переменные, поэтому если токен относится к этим типам, то я вызываю соответствующую функцию синглтона, который представляет таблицу символов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SymbolTable& SymbolTable::instance()
{
    static SymbolTable instance;
    return instance;
}
 
void SymbolTable::addSymbol(string str)
{
    if (!table.empty())
    {
        if (std::binary_search(table.begin(), table.end(), str))
            return;
    }
    table.push_back(str);
    std::sort(table.begin(), table.end());
}
 
 
#define INSTANCE SymbolTable::instance()
.сpp

C++
1
2
3
Variable *obj = new Variable(1, temp);
            objects.push_back(obj);
INSTANCE.addSymbol(temp);
Далее мне будет необходимо выполнить генерацию промежуточного кода, проходя по вектору созданных объектов, и в случае, если это переменная или константа, обращаться к этой таблице символов для выяснения адреса символа (адрес бдет представлять просто индекс вектора).
Т.к. я впервые пробую реализовать этот паттерн, то не понимаю, удачный ли это вариант в данном случае (и будет ли он работать), и что еще важнее: как в случае синглтона реализовать таблицу символов для внутреннего блока (функции)?
0
gazlan
3133 / 1909 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
10.07.2016, 23:10 #4
Цитата Сообщение от Havana Посмотреть сообщение
натолкните на мысль
IMHO, хэш-таблица должна быть достаточна.
Compiler Design - Symbol Table. What is the difference between a symbol table and a hash table? 5.0 Introduction.

Не по теме:

И забыть о singleton'ах и прочих глупостях. Чем проще - тем лучше.

0
nonedark2008
934 / 673 / 148
Регистрация: 28.07.2012
Сообщений: 1,837
11.07.2016, 15:33 #5
Цитата Сообщение от Havana Посмотреть сообщение
я впервые пробую реализовать этот паттерн, то не понимаю, удачный ли это вариант в данном случае
Не вижу пока причин в его неудачности, но и плюсов в его использовании тоже немного.
Строение "таблицы" во многом зависит от реализуемого языка, если там нечто сложное с областями видимости и возможным захватом контекста, то нужно к этому вопросу подойти посерьезнее.
0
Havana
95 / 4 / 0
Регистрация: 04.12.2015
Сообщений: 19
11.07.2016, 17:19  [ТС] #6
Вот как раз с областями видимости главная сложность. Захвата контекста пока не предвидится. Вообще исходный язык довольно прост, похож на Basic, имена переменных в одну букву, но при переходе по gosub, если я правильно понимаю, мне будет необходимо создать временную таблицу символов для подпрограммы. Но при этом каждая такая таблица должна быть в одном экземпляре, если этого не сделать, то при каждом добавлении символа, будет создаваться отдельная таблица в 1 элемент. И еще к ней должны иметь доступ другие классы при получении адреса переменных и констант, поэтому я не могу просто поместить таблицу как структуру данных в файл исходного кода. Синглтон я взяла, потому что у меня нет другой идеи, как это реализовать. При этом я не понимаю, как с синглтоном возможно реализовать таблицу символов для подпрограммы (может, с помощью дочернего класса от родительского синглтона?) Если вы знаете, как это можно сделать проще/сложнее/иначе я буду благодарна за идеи.

Добавлено через 45 минут
Может я что неправильно понимаю, но вроде хеш-таблица - это структура данных и в статье так и написано. Если я заменю вектор на хеш-таблицу, как это поможет решить проблемы, которые я озвучила? Это может лишь ускорить поиск элемента при их большом количестве. Таблица должна быть глобальной для других классов, она не должна создаваться заново при добавлении каждого символа и при этом должна быть возможность создавать временные таблицы для подпрограмм.
0
nonedark2008
934 / 673 / 148
Регистрация: 28.07.2012
Сообщений: 1,837
11.07.2016, 20:24 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Havana, хмм. Если так возможно, то бы посоветовал посмотреть в сторону llvm. С ним будет проще в плане генерации кода и некоторых абстракций языка.
Цитата Сообщение от Havana Посмотреть сообщение
Если вы знаете, как это можно сделать проще/сложнее/иначе я буду благодарна за идеи.
В этом случае ваша таблица превращается в дерево.
Корень - глобальная область видимости, узлы - функции, циклы (различные выражения со своими областями видимости).
Когда идет обработка какого-то выражения, то для него в этом дереве находится его область видимости (либо поиском по уникальному имени, либо просто привязать указатель заранее). Если встречаем какое-то имя, то ищем его в текущей области, не нашли - поднимаемся выше по дереву.

Цитата Сообщение от Havana Посмотреть сообщение
Таблица должна быть глобальной для других классов, она не должна создаваться заново при добавлении каждого символа и при этом должна быть возможность создавать временные таблицы для подпрограмм.
Они не временные. Хотите использовать синглтон - используйте (да там простая глобальная переменная подойдет в общем-то), но в начале лучше разобраться что за структура данных им будет поддерживаться.
Я бы посоветовал как пример посмотреть реализацию каких-нибудь компиляторов попроще, для того же llvm есть кучка неплохих примеров (на английском конечно).
1
gazlan
3133 / 1909 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
11.07.2016, 21:57 #8
Цитата Сообщение от Havana Посмотреть сообщение
Если я заменю вектор на хеш-таблицу, как это поможет решить проблемы, которые я озвучила?
Вот здесь есть пример: Single Hash Table to Implement Symbol Table + поиск по "Scoping and Symbol Table" даст еще множество ссылок.
1
Havana
95 / 4 / 0
Регистрация: 04.12.2015
Сообщений: 19
11.07.2016, 22:13  [ТС] #9
Всем спасибо, буду разбираться!
0
Крюгер
0 / 60 / 3
Регистрация: 16.11.2012
Сообщений: 431
Записей в блоге: 9
Завершенные тесты: 1
05.09.2016, 01:30 #10
Havana,

Не по теме:

как заметил gazlan, чем проще компиль - тем лучше. тот же gcc без всех этих синглтонов и прочей заумной фиговины написан. Это так, к слову - дело ваше.

0
05.09.2016, 01:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2016, 01:30
Привет! Вот еще темы с ответами:

Написание простого компилятора - C++
Хотел бы попробовать написать простенький компилятор, но не знаю с чего начать, помогите ссылкой на какой нибудь урок или советом.

Создание своего ЯП и компилятора к нему - C++
вопрос в названии темы ПС: Мысли по поводу надо переводить твой язык в какой-нибудь паскаль и компилировать его прошу оставить и не...

Выбор компилятора под windows - C++
Здавствуйте,хотел узнать ваше мнение по поводу выбора компилятора языка C++(бесплатного) под ОС Windows XP. Visual c++ не предлагать,...

Работа с файлом. Таблица частотности для символов - C++
Доброго времени, задача такая, открыть файл считать повторяющиеся символы ( посчитать количество ) и потом отсортировать ( пример : символ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.