Парсер простого языка и его компилятор в .NET
В задании сказано:
Написать грамматику по словестному описанию
По этому я не очень понял, нужно ли самому руками писать парсер и токенайзер и воспользовался библиотекой antlr которая по вручную написанной грамматике построила эти компоненты. Тем не менее, в один из последних дней я написал свои лексер и парсер. Они очень примитивны. Чтобы их улучшить нужно
- Хранить в классе
Token
enum
со всеми типами, а не делать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
.