Парсер простого языка и его компилятор в .NET
В задании сказано:
Написать грамматику по словестному описанию
По этому я не очень понял, нужно ли самому руками писать парсер и токенайзер и воспользовался библиотекой antlr которая по вручную написанной грамматике построила эти компоненты. Тем не менее, в один из последних дней я написал свои лексер и парсер. Они очень примитивны. Чтобы их улучшить нужно
- Хранить в классе
Tokenenumсо всеми типами, а не делатьisпо типу. Lexerдолжен сохранять состояние потока данных (и парсер его сохранять в дереве).- В обработке ошибок должен происходить не
throwчего-то странного, аthrowспециального исключения, которое сохраняетToken(илиAst.Baseесли это ошибка компиляции).
- Так же добавить
switchнаstloc_0, ... - Для ускорения нужно преобразовать массивы аргументов и локальных значений в
Dictionary. - Токенайзер не умеет читать
Int64.MIN_VALUE. - Обработка что переменная не найдена в классе (сейчас происходит
throw new NullReferenceиз методаEmit)
Еще одним заданием практики я выбрал "верификацию контрактов в kotlin". Там реализован следующий функционал статического анализа:
- проверка что читаемая переменная инициализирована
- проверка что все пути возвращают/не возвращают значение.
Из-за нехватки времени я не успею переписать все для этого парсера. Вот та репозитория.
- сделано (статичексие методы из класса)
- сделано (статические переменные из класса)
- добавлена поддержка нескольких функций (из-за этого компилируется в класс, а не
DynamicMethod), есть функции и процедуры. Локальные переменные в начале каждой функции. Присвоения, вызов процедур, проверка возврата. Добавлены операторы сравнения и ленивые&&и||. Типа bool нет, он работает через long, поскольку иначе пришлось бы добавлять типы переменным, а это долго. Добавлено ветвление с необязательным блокомelse. Поддержка<=,>=,!добавляется аналогично другим операциям. Значенияtrue/falseне добавлены, т.к. в языке есть только типlong. Их можно добавить, отредактировавDictionaryключевых слов, и добавив их обработку в функциюParseValue.
Для проверки типов выражений было бы нужно возвращать Type, а не bool как для проверки на void.