39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
|
||||||
1 | ||||||
Интепретатор №201.10.2009, 16:53. Показов 2909. Ответов 17
Метки нет (Все метки)
Прочитав тему [C++]Пишем свой интерпретатор, воодушевился написать свой, с 0.
На данный момент застопорился на арифметике. У меня возникла проблема с порядком вычислений. Если брать в "лоб" то выражение 2+2*2 будет равно 8. Если добавить рекурсию - то 2+2*2 будет считатся корректно, но выражение 3-1+2 будет равно 0, т.к. фактически оно считает 3-(1+2) (что необходимо для сохранения приоритета умножений/делений). Как лучше решить этот вопрос? Высладываю свою функцию расчета:
1
|
01.10.2009, 16:53 | |
Ответы с готовыми решениями:
17
Компилятор или интепретатор. Интепретатор case Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
|
|
01.10.2009, 17:04 | 2 |
Можно использовать польскую инверсную запись, например, a+b в этой записи будет ab+. В этом случае отпадает необходимость в скобках.
0
|
01.10.2009, 17:16 | 3 |
Если тебя интересует просто вычисление выражения, то можно воспользоваться польской записью, про которую на форуме уже писалось много раз. Если реально хочешь сделать что-то наподобие интерпретатора, особенно если в него будет входить промежуточное представление, то тут лучше делать через рекурсивный спуск
Для начала посмотри пример и описание к этому примеру. Если будут какие-то конкретные вопросы - задавай Формальное описание синтаксиса для этой программы примерно такое: Код
Expr = Term { ("+"|"-") Term } Term = Factor { ("*"|"/") Factor } Factor = CONST | IDENT | "(" Expr ")" Добавлено через 45 секунд Ну и чисто для самообразования: интепрЕтатор
1
|
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
|
|
01.10.2009, 17:45 [ТС] | 4 |
не думаю что это будет понятно простому русскому уму, т.к. нас еще в коле учили что 4ac это 4*а*с
Добавлено через 25 минут
0
|
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
|
|
01.10.2009, 18:13 [ТС] | 6 |
0
|
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
|
|
01.10.2009, 18:27 | 7 |
Прочитайте про польскую инверсную запись.
ab+ - это представление не будет никуда выводиться, оно для облегчения работы с записью. Разумеется, что сначала нужно выражение к такой записи преобразовать.
1
|
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
|
|
01.10.2009, 20:03 [ТС] | 9 |
Evg, Кстати твоя программа заткнулась после вот такого примера:
(2-3+1*3)*2-4*(2-11)
0
|
01.10.2009, 20:47 | 10 |
может быть можно начать с того, что определить что создается, и составить для наглядности набор тестов, который проиллюстрирует задачу и послужит доказательством правильности функционирования.
например: "2/2" -> "1" "2.2/2" -> "1.1" ...
0
|
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
|
|
01.10.2009, 22:54 [ТС] | 12 |
может быть, но тогда выход из программы происходит не из main() т.к. я там добавил system("pause");
и получается что при простом примере все нормально, а при таком примере, окно открывается и сразу закрывается.
0
|
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
|
|
02.10.2009, 21:04 [ТС] | 14 |
Таки не работает, выдает:
0
|
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
|
|
02.10.2009, 23:43 [ТС] | 16 |
Не знаю, может мне тестером устраиватся? Или прелести Dev C++?
0
|
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
|
||||||
03.10.2009, 08:27 [ТС] | 18 | |||||
0
|
03.10.2009, 08:27 | |