Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
95 / 4 / 0
Регистрация: 04.12.2015
Сообщений: 19
1

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

10.07.2016, 16:54. Показов 2893. Ответов 9

Делаю простой компилятор и что-то зависла на вопросе о том, как хорошо реализовать таблицу символов. Реализовать в виде класса, где в качестве поля используется, скажем, вектор, в который добавляются символы. При этом, чтобы такая таблица была одна, и другие классы, представляющие структуру языка (Variable, Constant) могли к ней обращаться. Думала о реализации Одиночки, но не очень хорошо понимаю, каким образом его реализовать (раньше не делала). С другой стороны, если использовать Одиночку, получится ли тогда реализовать, кроме этой основной таблицы, локальные таблицы символов для функций в исходном языке? В общем, что-то я совсем запуталась, натолкните на мысль, пожалуйста!
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2016, 16:54
Ответы с готовыми решениями:

Ошибка компилятора fatal error C1091: ограничение компилятора: длина строки превышает 65535 байт
Компилируя программу вот такой командой: cl /O2 /Oi /GL /EHsc /MD /Gy main.cpp И компилятор...

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

Таблица символов для 1620
Ищу таблицу символов для двухстрочника P1620B (он же, на наклейке VHX1620 BHRC9) Нужна "стрелка...

Таблица символов
Вывести на экран таблицу символов без использования строк и массивов. Вывод символов должен...

9
1360 / 997 / 316
Регистрация: 28.07.2012
Сообщений: 2,759
10.07.2016, 21:17 2
Цитата Сообщение от Havana Посмотреть сообщение
как хорошо реализовать таблицу символов
Поподробнее, что за таблица?
Что за символы в ней?
Это относится к части синтаксического анализа или уже что-то другое?
0
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
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 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
1360 / 997 / 316
Регистрация: 28.07.2012
Сообщений: 2,759
11.07.2016, 15:33 5
Цитата Сообщение от Havana Посмотреть сообщение
я впервые пробую реализовать этот паттерн, то не понимаю, удачный ли это вариант в данном случае
Не вижу пока причин в его неудачности, но и плюсов в его использовании тоже немного.
Строение "таблицы" во многом зависит от реализуемого языка, если там нечто сложное с областями видимости и возможным захватом контекста, то нужно к этому вопросу подойти посерьезнее.
0
95 / 4 / 0
Регистрация: 04.12.2015
Сообщений: 19
11.07.2016, 17:19  [ТС] 6
Вот как раз с областями видимости главная сложность. Захвата контекста пока не предвидится. Вообще исходный язык довольно прост, похож на Basic, имена переменных в одну букву, но при переходе по gosub, если я правильно понимаю, мне будет необходимо создать временную таблицу символов для подпрограммы. Но при этом каждая такая таблица должна быть в одном экземпляре, если этого не сделать, то при каждом добавлении символа, будет создаваться отдельная таблица в 1 элемент. И еще к ней должны иметь доступ другие классы при получении адреса переменных и констант, поэтому я не могу просто поместить таблицу как структуру данных в файл исходного кода. Синглтон я взяла, потому что у меня нет другой идеи, как это реализовать. При этом я не понимаю, как с синглтоном возможно реализовать таблицу символов для подпрограммы (может, с помощью дочернего класса от родительского синглтона?) Если вы знаете, как это можно сделать проще/сложнее/иначе я буду благодарна за идеи.

Добавлено через 45 минут
Может я что неправильно понимаю, но вроде хеш-таблица - это структура данных и в статье так и написано. Если я заменю вектор на хеш-таблицу, как это поможет решить проблемы, которые я озвучила? Это может лишь ускорить поиск элемента при их большом количестве. Таблица должна быть глобальной для других классов, она не должна создаваться заново при добавлении каждого символа и при этом должна быть возможность создавать временные таблицы для подпрограмм.
0
1360 / 997 / 316
Регистрация: 28.07.2012
Сообщений: 2,759
11.07.2016, 20:24 7
Лучший ответ Сообщение было отмечено Havana как решение

Решение

Havana, хмм. Если так возможно, то бы посоветовал посмотреть в сторону llvm. С ним будет проще в плане генерации кода и некоторых абстракций языка.
Цитата Сообщение от Havana Посмотреть сообщение
Если вы знаете, как это можно сделать проще/сложнее/иначе я буду благодарна за идеи.
В этом случае ваша таблица превращается в дерево.
Корень - глобальная область видимости, узлы - функции, циклы (различные выражения со своими областями видимости).
Когда идет обработка какого-то выражения, то для него в этом дереве находится его область видимости (либо поиском по уникальному имени, либо просто привязать указатель заранее). Если встречаем какое-то имя, то ищем его в текущей области, не нашли - поднимаемся выше по дереву.

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

Не по теме:

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

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2016, 01:30

Таблица символов
Надо присвоить а=1, б=2, в=3, …я=33, я всякий бред перебрал, не как не получается(((

Таблица символов
Доброго, ищу похожую таблицу как в файле для русскоязычных символов, или похожую, если нет то как...

Таблица символов
Возможно ли как то в онлайн чате заблочить таблицу символом? Ну например Alt + 255 ...

Таблица символов
Как сделать таблицу символов? В яве это так private static char genTable() { ...


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

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

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