Skip to content
This repository has been archived by the owner on Dec 15, 2020. It is now read-only.

kp2pml30/compiler-for-dotnet-cil

Repository files navigation

Compiler for .net platform

Описание

Парсер простого языка и его компилятор в .NET

Парсер

В задании сказано:

Написать грамматику по словестному описанию

По этому я не очень понял, нужно ли самому руками писать парсер и токенайзер и воспользовался библиотекой antlr которая по вручную написанной грамматике построила эти компоненты. Тем не менее, в один из последних дней я написал свои лексер и парсер. Они очень примитивны. Чтобы их улучшить нужно

  1. Хранить в классе Token enum со всеми типами, а не делать is по типу.
  2. Lexer должен сохранять состояние потока данных (и парсер его сохранять в дереве).
  3. В обработке ошибок должен происходить не throw чего-то странного, а throw специального исключения, которое сохраняет Token (или Ast.Base если это ошибка компиляции).

Todo

  1. Так же добавить switch на stloc_0, ...
  2. Для ускорения нужно преобразовать массивы аргументов и локальных значений в Dictionary.
  3. Токенайзер не умеет читать Int64.MIN_VALUE.
  4. Обработка что переменная не найдена в классе (сейчас происходит throw new NullReference из метода Emit)

Другие проекты

Еще одним заданием практики я выбрал "верификацию контрактов в kotlin". Там реализован следующий функционал статического анализа:

  • проверка что читаемая переменная инициализирована
  • проверка что все пути возвращают/не возвращают значение.

Из-за нехватки времени я не успею переписать все для этого парсера. Вот та репозитория.

Дополнительные задания:

  1. сделано (статичексие методы из класса)
  2. сделано (статические переменные из класса)
  3. добавлена поддержка нескольких функций (из-за этого компилируется в класс, а не DynamicMethod), есть функции и процедуры. Локальные переменные в начале каждой функции. Присвоения, вызов процедур, проверка возврата. Добавлены операторы сравнения и ленивые && и ||. Типа bool нет, он работает через long, поскольку иначе пришлось бы добавлять типы переменным, а это долго. Добавлено ветвление с необязательным блоком else. Поддержка <=, >=, ! добавляется аналогично другим операциям. Значения true/false не добавлены, т.к. в языке есть только тип long. Их можно добавить, отредактировав Dictionary ключевых слов, и добавив их обработку в функцию ParseValue.

Для проверки типов выражений было бы нужно возвращать Type, а не bool как для проверки на void.

About

Compiler of simple language for .NET

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published