|
Программирование
On-line приложения
Почитать
Web-сервер Apache
Печать и форматирование
MySQL
Разные рецепты
Сборка/установка
Справки
Философия
Мой опыт
Скачать
Программы на Tcl/Tk (GUI)
Программы на Python/Tk (GUI)
Программы (CLI)
Help
Хобби
Фракталы
on-line
Язык для рисования фракталов
Гиперкуб
Теория относительности
Ампуллярии
Преподавание
Студенту/абитуриенту
Мой опыт
Автора!
|
Хотите улучшить Fact?Если вам понравился Fact, если вы хотите не только использовать его, но и развивать его возможности, я буду рад любым предложениям, а чтобы облегчить ваш труд и избавить себя от лишних вопросов я написал это краткое введение в устройство моего интерпретатора Fact. Присылайте ваши примерыЕсли вам удалось создать красивые фракталы или выразительные примеры и вы хотите поделиться своими достижениями с другими, то я с удовольствием включу ваши программы в дистрибутив. Все авторы буду упомянуты. Желающим развивать FactВзгляд с высоты птичьего полётаFact написан на Python 2.4 (так же успешно протестирован на 2.5 и 2.6a0). Программа обрабатывается в три шага: token_list = TokenSeq() # 1. разбиение на токены
token_list = load(text) # и отсечение комментариев
code=Prog() # 2. компиляция во внутреннее
code=load(token_list) # представление (последовательность
# классов операций)
code.execute(context) # 3. выполнение программы в заданном
# контекстеМетод Синтаксический анализатор очень прост. Он проще обычных тем, что производит только удаление комментариев и разбиение на слова. Он не анализирует, является ли токен идентификатором или числом. Это во многом определяется тем обстоятельством, что в языке отсутствует понятие ключевого слова и более тонкий разбор теряет смысл. Побочным эффектом такой идеологии становится возможность создания переменных с именем-числом. Как и большинство синтаксических анализаторов, он работает в один проход, анализируя регулярный язык. Лексический анализатор анализирует LL(1) (Left to right, Leftmost derivation, 1 tokens of look-ahead; http://en.wikipedia.org/wiki/LL_parser) язык, грамматика языка такова, что становится возможным анализ в один линейный проход. Такое упрощение становится возможном благодаря двум обстоятельствам.
Кстати из этих двух правил следует невозможность использования
закрывающих блок конструкций, состоящих из нескольких токенов.
То есть, на пример, в рамках этих правил не возможны
конструкции типа Есть изменения, кажущиеся необходимыми, но на самом деле нежелательные. Видно, что и синтаксический и лексический анализаторы работают в один проход и могут быть легко объединены. Однако я специально этого не делаю и не буду принимать подобные предложения, так как эти два механизма не только выполняют разные функции, но и работают с разными грамматиками (регулярной и LL(1)-контекстно-свободной). Упрощение лексического анализатора возможно потому, что все «фразы» имеют определённую длину, однозначно определяемую по первому токену. Это накладывает существенные ограничения на возможные языковые конструкции, но пока я не вижу оснований переходить на более выразительную лексику и идти на усложнение анализатора. И на конец, я хотел бы добавить, что контекстно-свободная грамматика не может быть обработана регулярным выражением. Пожалуйста не тратьте силы на создание конечных автоматов для лексического анализа. Мой анализатор очень похож на конечный автомат, но это только на первый взгляд. Структура классовЕдиницей Fact-программы является токен. Объекты класса Класс Текущая реализация такова, что после загрузки из файла, последовательность токенов может быть выдана только один раз. Эта «ущербность» может быть легко устранена, но пока я не вижу на то оснований, так как грамматическому анализатору последовательность токенов требуется только один раз. Класс системы координат, Этот класс умеет делать собственную копию. То есть создавать новый экземпляр, инициализируя его параметрами заданного экземпляра. Класс Все классы команд (
Классы, управляющие порядком выполнения программы
(условные переходы, вызов подпрограмм, локализация контекста)
хранят отдельные экземпляры класса Структура классов операций такова: ExCommon . . . . . . . . базовый | +-- ExCommon1 . . . . . операции с одним аргументом | | | +-- ExScale . . . . масштабирование | +-- ExSetWidth . . установка толщины линии | +-- ExCallSub . . . вызов подпрограммы | +-- ExCommon2 . . . . . операции с двумя аргументами | | | +-- ExSetVar . . . . присвоение значения | +-- ExIncrVar . . . прибавление | +-- ExMulVar . . . . домножение | +-- ExShift . . . . . . сдвиг | | | +-- ExDraw . . . . . сдвиг с отрисовкой | +-- ExRotate . . . . . поворот | | | +-- ExRight . . . . по часовой | +-- ExLeft . . . . против часовой | +-- ExSetColor . . . . . установка цвета | | | +-- ExSetBGColor . установка цвета фона | +-- ExCommonCode . . . . базовый для всех блочных операций | | | +-- ExLocal . . . . локализация | +-- ExSave . . . . . локализация только переменных | +-- ExTransform . . локализация только трансформаций | +-- ExDefSub . . . . определение подпрограммы | +-- ExRepeat . . . повторение в цикле | +-- ExCondition . . . . условия +-- ExDump . . . . . . остановка с дампом +-- ExUpdateWindow . . . отрисовка промежуточного состояния Контейнер контекста — класс Он умеет создавать новый экземпляр с копией переменных старого экземпляра. При этом копируются только переменные и система координат, остальные атрибуты просто ссылаются на соответствующие атрибуты родителя. Это позволяет создавать локальные контексты, локализуя только часть параметров контекста. Экземпляры класса Все вышеперечисленные классы имеют корректные методы
Остальные классы не отвечают за выполнение программы. Класс Класс Класс Так же имеются классы исключений:
Надеюсь, после этого краткого введения вам будет очень легко читать и развивать код. TODOЕсть ряд изменений и «улучшений», которые я не сделал по двум причинам: либо я не уверен в их целесообразности, либо у меня возникли затруднения. Если вы предложите улучшенную версию этих улучшений или сумеете разрешить вопросы с которыми я испытываю затруднения, я буду крайне признателен. Улучшения, которые я не очень понимаю как сделать
В версии 2.3 я сделал окно изменяемым. Вроде получилось не плохо, но я оставил для скачивания обе версии: с изменяемым и не изменяемым окном. Неточности и небрежностиОтносительно интерфейса. Если вы найдёте опечатки или предложите уточнённые фразы, я буду очень признателен. |
|
|
|