Форум программистов, компьютерный форум CyberForum.ru

C++

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

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

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

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

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

Таблица кодировки символов - C++
Добрый день! Помогите пожалуйста написать программу, которая выводит на экран первую часть таблицы кодировки символов ( символы с кодами от...

Частотная таблица повторений символов - C++
Підрахувати для текста частотну таблицю, тобто для кожного символа визначити, його частоту появи в тексті (число таких символів у тексті...

Таблица ввода и вывода символов - C++
где то видел что есть таблица в которой показана какие цифры надо вводить в пограмме для разных букв. вродебы это atsi ещё помню что буква...

Тесты для компилятора - C++
Есть такая задача: Выполните какие-нибудь тесты,чтобы убедиться,что ваш компилятор создаёт эквивалентные коды для итераций по индексу и с...

Выбор редактора + компилятора для C++ - C++
Здравствуйте! Посмотрел темы про редакторы - нужного не нашел. Нужен какой-нибудь нормальный редактор с интегрированным...

Юзерская переменная для компилятора - Visual C++
Доброго юзаю MS Visual Studio Такой вопрос, мне нужна переменная в самой студии, что бы при компиляции проекта, в ехе-шник заносилось...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nonedark2008
884 / 623 / 125
Регистрация: 28.07.2012
Сообщений: 1,664
10.07.2016, 21:17     Таблица символов для компилятора #2
Цитата Сообщение от Havana Посмотреть сообщение
как хорошо реализовать таблицу символов
Поподробнее, что за таблица?
Что за символы в ней?
Это относится к части синтаксического анализа или уже что-то другое?
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);
Далее мне будет необходимо выполнить генерацию промежуточного кода, проходя по вектору созданных объектов, и в случае, если это переменная или константа, обращаться к этой таблице символов для выяснения адреса символа (адрес бдет представлять просто индекс вектора).
Т.к. я впервые пробую реализовать этот паттерн, то не понимаю, удачный ли это вариант в данном случае (и будет ли он работать), и что еще важнее: как в случае синглтона реализовать таблицу символов для внутреннего блока (функции)?
gazlan
3130 / 1905 / 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'ах и прочих глупостях. Чем проще - тем лучше.

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

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

Цитата Сообщение от Havana Посмотреть сообщение
Таблица должна быть глобальной для других классов, она не должна создаваться заново при добавлении каждого символа и при этом должна быть возможность создавать временные таблицы для подпрограмм.
Они не временные. Хотите использовать синглтон - используйте (да там простая глобальная переменная подойдет в общем-то), но в начале лучше разобраться что за структура данных им будет поддерживаться.
Я бы посоветовал как пример посмотреть реализацию каких-нибудь компиляторов попроще, для того же llvm есть кучка неплохих примеров (на английском конечно).
gazlan
3130 / 1905 / 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" даст еще множество ссылок.
Havana
95 / 4 / 0
Регистрация: 04.12.2015
Сообщений: 19
11.07.2016, 22:13  [ТС]     Таблица символов для компилятора #9
Всем спасибо, буду разбираться!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2016, 01:30     Таблица символов для компилятора
Еще ссылки по теме:

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

указание ключа компилятора для OpenMP - C++
смотрю на сайте http://edu.chpc.ru/parallel/mainse4.html Для использования механизмов OpenMP нужно скомпилировать программу компилятором,...

Написание компилятора для С++ программ в блокноте - C++
Приветствую. Такой вопрос, можно ли написать bat файл который являлся бы компилятором для С++(нормальные среды разработки у меня есть,...

Перевод формулы понятной для компилятора - C++
С половиной справился, но каким образом записать крайнюю левую переменную. Формулу прикрепил. Это вроде нужно отдельной функцией как то...

Нарисовать квадрат на C++ (желательно для компилятора Dev C++) - C++
Всем привет! Надо нарисовать квадрат размером 20 на 20 пикселей красного цвета с координатами x - 100, y - 200 в окне размером 300 на 500...


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

Или воспользуйтесь поиском по форуму:
Крюгер
0 / 60 / 3
Регистрация: 16.11.2012
Сообщений: 418
Записей в блоге: 3
05.09.2016, 01:30     Таблица символов для компилятора #10
Havana,

Не по теме:

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

Yandex
Объявления
05.09.2016, 01:30     Таблица символов для компилятора
Ответ Создать тему
Опции темы

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