Оригинал: Exercise 36: Simple Calculator
Переводчик: Феликс Ли
Лицензия: CC BY-NC-SA 4.0
Гордо использует Google Translate
Это задание заключается в создании простого алгебраического калькулятора, используя всё то, что вы узнали о парсинге. Вам потребуется спроектировать язык для выполнения базовых математических операций с использованием переменных, создать ABNF для этого языка и написать сканнер, парсер, анализатор и интерпретатор для него. На самом деле это может быть переоценкой задачи для простого языка калькулятора, так как нет никаких вложенных структур, таких как функции, но всё же важно понять полный процесс.
Простой алгебраический язык имеет разные значения для разных людей, поэтому попробуйте команду Unix bc
. Вот пример моего запуска команды bc
:
$ bc
bc 1.06
Copyright 1991-1994, OnClickListener 1997, OnClickListener 1998, OnClickListener 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty`.
x = 10
y = 11
j = x * y
j
110
```Вы должны создать переменные, вводить числа (включая целые и вещественные) и использовать столько операторов, сколько сможете придумать. Вероятнее всего, вам потребуется использовать `bc`, даже если это shell Python, и когда вы освоите это, вам придётся написать ABNF для него. Помните, что ваш ABNF практически является псевдокодом и не обязательно должен быть формально корректным, он должен быть достаточно близким для создания сканера и парсера.Как только вы "просто" создали грамматику в форме ABNF, вы можете приступить к созданию сканера и парсера. Я напишу набор простых скриптов, чтобы практиковать то, что вы считаете, что язык должен делать, а затем запустить ваши тестовые наборы через ваш калькулятор на каждом этапе. Это поможет легче тестировать калькулятор.После завершения парсера вы должны написать анализатор для его укрепления и проверки семантики входных данных. В таком простом языке это может быть больше, чем вам нужно, но это упражнение, чтобы закончить весь процесс на маленьком игрушечном языке. Помните, что важной задачей анализатора является отслеживание определений переменных в различных местах скрипта, чтобы они были доступны для интерпретатора во время выполнения. После создания анализатором исполняющегося дерева разбора вы можете написать интерпретатор, который его выполнит. Как описано в упражнении 35, существует два способа написания такого интерпретатора. Один заключается в создании "машины", которая знает, как выполнять грамматические конструкции, представляя их как последовательность входных данных. Это рассматривает ваши классы грамматических конструкций (`Expression`, `Assignment` и т. д.) как машиный код и просто выполняет содержащиеся в них операции. Другой стиль, характерный для объектно-ориентированных языков программирования, таких как Python, состоит в том, чтобы каждый класс грамматической конструкции знал, как сам себя выполнить. В этом подходе эти классы являются "умными" и принимают свои окружения, выполняя необходимые действия для достижения цели. Затем вам нужно просто пройтись по списку грамматических конструкций и вызвать метод `run`, пока все не будет выполнено.Выбор одного из вариантов определяет место хранения состояния вашего небольшого интерпретатора. Если вы создаете класс `Interpreter`, который выполняет только продукционные данные объекты, то интерпретатор может отслеживать все состояние, но язык будет сложнее расширяться, так как вам придется улучшать `Interpreter` для каждого продукционного класса. Если ваши продукционные классы знают, как выполнять свой собственный код, то расширение языка становится легче, но вам нужно найти способ передачи состояния компьютера между каждым продукционным классом.При работе с этим вопросом я советую начать с очень простого выражения, такого как сложение. Дайте всей системе возможность работать от сканера до выполнения простого сложения. Затем, если вы не довольны этим дизайном, вы можете его отбросить и использовать другой дизайн. Как только ваш дизайн начинает работать, вы можете расширить язык более мощными возможностями.
## Исследовательское обучение
+ Создание функций для выполнения вычислений и возврата результатов — это лучший подход к исследовательскому обучению. Если вы сможете сделать это, то ваш дизайн вполне может применяться к более широкому языку.
+ Следующий шаг — попробуйте реализовать поток управления с помощью операторов `if` и проверок типа `boolean`. Если это слишком сложно, то это правильно, но попробуйте всё равно.
## Глубокое изучение
Как можно глубже изучите язык `bc` или Python. Попробуйте найти другие файлы синтаксического анализа для чтения и обучения, особенно любые описания протоколов IETF. Нормативные акты IETF (как бумажные полотенца) захватывают воображение, но они отличная практика.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )