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

С++ для начинающих

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

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

09.01.2012, 14:02. Просмотров 1543. Ответов 14
Метки нет (Все метки)

Здравствуйте.

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

Я использую массив строки.
Как реализовать повторность через map?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2012, 14:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Синтаксический анализ выражений (C++):

Синтаксический анализ - C++
Много кто берётся но мало кто доводит до конца эту тему... Я написал класс Expression смысл которого сводится к тому, чтобы вычислить...

Лексический и синтаксический анализ текста - C++
Доброго времени суток, нужно написать курсач по программированию - реализовать алгоритм лексического анализа предложений -...

Лексический и синтаксический анализ текста - C++
Доброго времени суток, товарищи.Сейчас учусь в универе и дали задание курсовой работы на с++.Я читаю его и понятия не имею что нужно...

Синтаксический и семантический анализ во Flex и Bison - C++
Здравствуйте) помогите пожалуйста написать анализ на C++ чтобы потом перевести его во Flex и Bison. Я без понятия что там надо делать....

Интерпретатор выражений с переменной(разбор и анализ строки)) - C++
Может у кого есть библиотечка по данному сабжу? В идеале надо чтобы пользователь мог вводить любую функцию y=f(x) и для любого значения...

Написать парсер математических выражений с функцией упрощения этих выражений - C++
Люди, здравствуйте. Есть такая задача: написать упроститель выражений. На вход подается строка вида "a*b+a*c", являющаяся корректным...

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

Синтаксический анализатор - C++
Нужна помощь именно с алгоритмом. Задание звучит так - проверить корректность написания заголовка функции. Прототипы не учитываются. ...

синтаксический анализатор - C++
Доброго времени суток. Подскажите как написать синтаксический анализатор кода(паскаль). Как это правильно делать? как это сделано в средах...

Синтаксический редактор - C++
Здравствуйте пишу с просьбой помочь в реализации программки на С или С++ быть может кто либо уже делал подобное вобщем нужно...

Синтаксический анализатор - C++
никак не могу разобраться с заданием, может быть кто-то сталкивался 1.Построить синтаксические диаграммы для следующих конструкций; ...


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

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

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