Как начать создавать небольшой компилятор для школьного проекта в Java или C # - PullRequest
3 голосов
/ 01 ноября 2011

для моего финального экзамена (чтобы окончить университет) меня попросили создать крошечный компилятор со следующими требованиями:

Студент должен разработать базовый компилятор со всеми элементами проектирования который соответствует этому (лексический анализ, синтаксический анализ, анализ и т. д.). Этот компилятор будет иметь интерфейс, который показывает 2 панели, графику представление (A) и кодовое представление (B). Пользователь будет возможность нарисовать геометрическую фигуру на панели (А), и программа покажет на панели B код, сгенерированный для этой формы, и если пользователь введите код в (B), он покажет форму в (A).

Этот компилятор должен обрабатывать как минимум 7 примитивов (наверное, это означает команд). Геометрическая форма должна быть создана из примитивов. Студент должен будет включить примитив, чтобы повернуть форму.

Так что дело в том, что мы никогда не изучали компиляторы в глубину, только самую основную теорию, у меня всего 20 дней, чтобы закончить это !! и я почти уверен, что они хотят меня провалить, потому что я попросил профессора сказать мне, что такое примитив, и он сказал, что не ответит на это, потому что это часть словарного запаса курса, который я хочу пройти.

Итак, вопрос здесь:

Как начать, как создать эту вещь в .NET или как создать очень маленький набор инструкций для создания геометрических фигур?

Есть ли что-то похожее на это требование, чтобы взять его в качестве примера и изменить его?

P.S .: Я разработчик .net C # (хорошие навыки). Я знаю основы C и Java. Я читаю о генераторах синтаксических анализаторов (ANTLR, lex & YACC, Ray), но базового руководства для этого нет, есть много новых терминов, таких как грамматика BNF (что это, язык, текстовый файл?). Это так сложно, потому что нет простого способа запуска или сэмплов для C #. Я не хочу делать этот проект на C или C ++, потому что он использует графику и мои знания C являются базовыми, я боюсь, что не смогу это сделать, я хотел бы использовать .Net

Ответы [ 3 ]

4 голосов
/ 01 ноября 2011

Это не столько компилятор, сколько интерпретатор / дизайнер. Но я отвлекся.

По сути, вас просят создать «язык команд рисования» и программу, которая может интерпретировать этот язык команд. Для примера того, что обычно должен делать «язык команд рисования», взгляните на LOGO .

Что вам нужно сделать, это определить простой набор инструкций (примитивов), которые в правильной комбинации приведут к рисованию фигуры. Вы также должны будете включить примитив, чтобы вращать форму. Вот определение Википедии «примитив» в соответствующем контексте. Делая это, вы создаете «язык» и «среду выполнения»; теоретически вы можете сохранить команды в файле, затем загрузить их в программу и повторно запустить, чтобы сгенерировать ту же форму.

Есть три основных способа, которыми вы могли бы пойти с этим:

  • Определите примитивы для рисования различных типов линий (прямые, изогнутые, сплошные, пунктирные и т. Д.) И задайте цвет, которым следует рисовать следующие линии. Скорее всего, вы создадите примитивы только для создания примитивов; вашими основными примитивами будут «Задать цвет» и «Рисовать линию».

  • Определение примитивов для рисования различных предварительно определенных фигур (линии, круга, прямоугольника, пятиугольника, шестиугольника и т. Д. И т. Д.). Это, вероятно, то, что будут делать ваши одноклассники, и это займет некоторое время и не будет очень функциональным.

  • Реализуйте "рисунок черепахи" так же, как ЛОГОТИП. Там будет курсор («черепаха»), который каким-то образом представлен на экране, и его текущее местоположение и куда он идет, является неотъемлемой частью рисования линий.

Лично мне нравится последняя идея; вам понадобятся примитивы для перемещения черепахи, для отметки начального и конечного положений линий, установки цветов, поворота, очистки и т. д .:

  • MVUP x - Переместить черепаху вверх на x пикселей
  • MVDN x - Переместить черепаху вниз на x пикселей
  • MVLT x - Переместить черепаху влево на x пикселей
  • MVRT x - Переместить черепаху вправо на x пикселей
  • SETC r g b - установить цвет рисования линий на значение RGB
  • STLN - отметить начало линии в позиции черепахи
  • ENDL - отметить конец линии в положении черепахи; вызывает рисование линии от начала до конца с использованием текущего цвета.
  • RTCL x - Поворот холста на x градусов по часовой стрелке (для этого требуется некоторая математическая математика, и вы потеряете все нарисованное, выпадающее из холста после поворота)
  • RTCC x - Поворот холста x градусов против часовой стрелки (то же самое)
  • CNTR - Поместите черепаху в самый центр холста. Полезно при определении начальной позиции, с которой нужно начинать, или во избежание изменения ряда сложных движений, чтобы вернуться в центр и снова нарисовать.
  • CLRS - Удалить все нарисованные линии с панели. Это, наряду с CNTR, вероятно, должно быть первыми двумя командами в «программе» для рисования какой-либо конкретной фигуры, но если вы их опустите, программа может построить сам себя итеративно, запустившись поверх своего предыдущего вывода для создания фрактальных паттернов .

Я только что дал вам 11 примитивных команд, которые можно использовать для перемещения курсора с места на место на холсте, рисования линий по ходу и для рисования любой 2D-фигуры, которую пожелает пользователь. Вы также можете использовать правую модель с поворотом вперед-назад-вправо, как если бы черепаха была роботом, но это, вероятно, сделало бы это более сложным, чем должно быть (помните YAGNI; он хорошо послужит вам в промышленности).

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

1 голос
/ 01 ноября 2011

Я рекомендую вам реализовать Context-Free Art .

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

Но, внедрив не зависящую от контекста грамматику, вы сможете создавать абсолютно потрясающие картинки из кода.Это будет массово удовлетворять и подтолкнет вас к полировке и прохождению, и у вас останется кое-что, чтобы потом покрасоваться.

0 голосов
/ 01 ноября 2011

Звучит так, как будто это упражнение о генерации и разборе чего-то вроде SVG.Похоже, профессор не совсем понимает, что такое компилятор.Перевод из текста в графику может быть в рамках академического определения компилятора, но он, безусловно, не отражает никакого реального смысла (несмотря на работу, проделанную над графическими языками программирования).

Возможно, чтобы выполнить требование "компилятор "вы можете перевести подмножество SVG (текстовое) в команды JavaScript для генерации графики.Для значения "примитив" вы можете просто Google это .В некотором роде проявите инициативу.

Тогда вы могли бы сделать свой пользовательский интерфейс в HTML, который бы соответствовал временным рамкам лучше, чем все остальное, что я могу себе представить.По сути, это было бы что-то вроде Google Documents Draw, за исключением отображения чертежа в формате SVG.

Cheers & hth.,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...