PDA

Просмотр полной версии : n-ичный калькулятор на C++


Brosik
29.10.2002, 03:07
Подскажите плизз, как сделать сабжевый калькулятор! Должно вводиться уравнение в 17-ной системетипа: 1g-5*d*(h1-8e/e)+4-ga. Скобок может быть сколько угодно:( И программа всё это считает и выводит результат в 17-ной, 10-ной, 2-ной, 16-ной, 8-ной системах счисления... Подскажите кто чем может. Заранее благодарен. С уважжением Bro$ik...

Mickey
29.10.2002, 15:06
Система счисления - не важна сама по себе, ибо перевод из одной в другую - задача элементарная. А насчет калькулятора - необходимо идти стандартным путем:
Пишешь 3 компонента - лексический анализатор, выделяющий числа и знаки операций, синтаксический анализатор, который использует рез-ты лексического, чтобы сформировать дерево вычислений и решатель, который по дереву вычислений возвращает результат.
Я для написания лексического и синтаксического анализатора пользуюсь связкой flex - bison (или lex - yacc).
Если что - можно и поподробнее.

Brosik
30.10.2002, 02:37
Mickey
если можно, то пожалуйта поподробнее! я просто в "с++" не силен:(((

Mickey
30.10.2002, 15:21
А обязательно С++? Для таких вещей можно и обычный С использовать. Кстати, эти инструменты восновном на С и расчитаны.
И что нужно подробнее?

Brosik
30.10.2002, 21:47
Разумеется можно и просто в "с"... Конечно будет просто супер если Вы опишите подробно компоненты - лексический анализатор, синтаксический анализатор и связку flex - bison...
Лично я в том, что Вы написали практически ничего не понимаю... Ведь сами посудите - задавать такое задание студенту первого курса - это просто издевательство или переоценка сил этого самого студента... Если есть время и мысли то я буду крайне признателен за помощь....

Mickey
31.10.2002, 15:01
НУ если писать более детально - то это должно выглядеть примерно так.
1. Лексический анализатор.
Находится в одном из трех состояний:

- начальное (оно же рабочее) - состояние считывания начала очередной лексемы (интерпретируемой конструкции). Из этого сотояния происходят переходы в другие при следующих условиях:
- - При чтении знака операции - сообщается о прочитаном знаке операции и переход в это же состояние
- - При чтении n-ричной цифры - переход в состояние считывания n-ричного числа
- - При чтении любого другого символа - переход в состояние ошибки.

- считывание n-ричного числа - состояние считывания значения n-ричного числа. Переход из этого состояния происходит по следующим правилам.
- - Считывание очередного символа n-ричного числа - возврат в текущее состояние
- - Считывание знака операции - оповещение о считанном числе и переход в начальное состояние
- - Считывание другого символа - переход в состояние ошибки.

- состояние ошибки - состояние сообщения об ошибке и возможный отказ в интерпретации данных. В зависимости от типа интерпретатора, это состояние может вести себя по разному - или выходить из интерпретатора, или отменять часть интерпретируемых данных и продолжать интерпретацию.

2. Синтаксический анализатор - получает информацию от лексического о наборе входных лексем и строит в соответствии с ними конструкции языка. Его состояния расписывать долго, но тоже можно. Проще взять инфу по bison. Там, кстати, и есть пример построения простейшего калькулятора.
Результат синтаксического анализа - дерево исполнения выражения, которое выдается на исполнитель.

3. Исполнитель дерева выражения - производит обход дерева и исполнения выражения закодированного тим деревом.

Насчет flex-bison - это - GNU-тые утилиты для построения лексического и синтаксического анализаторов. Они пошли еще из UNIX, где имели название lex и yacc, соответственно.
Про бизона см. http://www.gnu.org/directory/devel/specific/bison.html
Ну а про flex - надо искать отдельно. Но не думаю, что это будет сложно.