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

Синтаксический анализ выражений - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
09.01.2012, 14:02     Синтаксический анализ выражений #1
Здравствуйте.

У меня в текстовом файле есть 3 выражения
PRICE = 5
TAX = PRICE * 1e-02
COST = PRICE + TAX
Выражение анализирует нормально.
Вот, Как можно взять значения выражения PRICE и TAX? И подставить в выражение COST = 5 + 0.05.

Я использую массив строки.
Как реализовать повторность через map?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.01.2012, 14:17     Синтаксический анализ выражений #2
mario[x], вас какая сторона вопроса интересует? Теоретическая или практическая? Если теоретическая - то тут нужна таблица идентификаторов. Если практическая, то таблицу это можно реализовать самыми разными способами - от массива структур до хэш-таблицы идентификаторов.
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
09.01.2012, 14:41  [ТС]     Синтаксический анализ выражений #3
в сторону практики.
PRICE = 5 разобрал выражение
TAX = PRICE * 1e-02 вот здесь как брать пред. значение PRICE?
Выражение храню в массиве строки, и там ж перебираю, т.е. PRICE, "=", 5.
PRICE в Variable, "=" в alpha, 5 в constant.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.01.2012, 14:42     Синтаксический анализ выражений #4
mario[x], вы сохраняете PRICE как переменную со значением 5 в какой-нибудь таблице идентификаторов?
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
09.01.2012, 15:08  [ТС]     Синтаксический анализ выражений #5
ну да, в таблицу имен.
Пример выражения в входном файле input.txt

PRICE = 5
TAX = PRICE * 1e-02
COST = PRICE + TAX

Выходной файл output.txt
===========
Таблица имен

ID Variable
0 PRICE

Неоптимизированный код

LOAD =5
STORE PRICE

===========
Таблица имен

ID Variable
0 PRICE
1 TAX

Неоптимизированный код

LOAD =0.01
STORE $1
LOAD PRICE
MPY $1
STORE TAX

===========
Таблица имен

ID Variable
0 PRICE
1 TAX
2 COST

Неоптимизированный код

LOAD =0.98
STORE $2
LOAD TAX
STORE $1
LOAD PRICE
ADD $1
MPY $2
STORE COST
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.01.2012, 15:12     Синтаксический анализ выражений #6
mario[x], ну вот, при встрече идентификатора идём в таблицу, ищем там этот идентификатор, если находим - берём его значение из таблицы и используем вместо идентификатора в выражении. Если не находим - очевидно, ошибка.
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
09.01.2012, 15:18  [ТС]     Синтаксический анализ выражений #7
Походу понял, надо брать значение с идентификатора?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.01.2012, 15:22     Синтаксический анализ выражений #8
mario[x], разумеется, не из воздуха же. Встречаем идентификатор -> запрашиваем у таблицы информацию о нём -> берём значение из предоставленных данных -> пользуемся значением вместо имени. Надо ещё не забывать обновлять значение, например, при присваивании.
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
09.01.2012, 15:43  [ТС]     Синтаксический анализ выражений #9
Вот например,
PRICE = 5
TAX = PRICE * 1e-02.
В этом случае как получить значение 0.05. Т.е. TAX= 0.05. Я как бы щас разбираю выражение, без вычисления.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.01.2012, 15:44     Синтаксический анализ выражений #10
Стоп. Вы разбираете выражение без вычисления, но хотите всё-таки вычислить какое-то значение? Вы уж разберитесь, чего хотите.
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
09.01.2012, 15:47  [ТС]     Синтаксический анализ выражений #11
Ну т.е. в COST уже измененное значение TAX говорю.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.01.2012, 15:49     Синтаксический анализ выражений #12
Давайте для начала определимся, вы пишите компилятор или интерпретатор? Если интерпретатор, то действуйте так, как я уже говорил, в таблице идентификаторов храните пару (в простейшем случае) имя-значение. При встрече имени заменяете его соответствующим значением из таблицы.
Ну а если пишется компилятор - то там всё совсем иначе, там уже никаких таблиц нет и в помине, вы напрямую должны оперировать константами и адресами.
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
09.01.2012, 15:56  [ТС]     Синтаксический анализ выражений #13
вообще то интерпретатор...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.01.2012, 15:59     Синтаксический анализ выражений #14
mario[x], ну и всё, какие проблемы-то? Храним в таблице структуры (в простейшем случае):
C++
1
2
3
4
5
struct Identifier
{
    std::string name;
    double value;
};
При этом таблицей (поскольку код учебный) может быть элементарно массив или список. Видим идентификатор - ищем в таблице запись с полем name, соответствующим искомому идентификатору. Нашли - заменяем идентификатор на поле value найденной записи.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2012, 16:04     Синтаксический анализ выражений
Еще ссылки по теме:

синтаксический анализатор C++
Синтаксический и семантический анализ во Flex и Bison C++
C++ Лексический и синтаксический анализ текста

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

Или воспользуйтесь поиском по форуму:
mario[x]
2 / 2 / 0
Регистрация: 11.06.2011
Сообщений: 43
14.01.2012, 16:04  [ТС]     Синтаксический анализ выражений #15
ну что сказать,
Спасибо!
Yandex
Объявления
14.01.2012, 16:04     Синтаксический анализ выражений
Ответ Создать тему
Опции темы

Текущее время: 15:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru