Робкий взгляд на C++

Мы показали проект компилятора нескольким знакомым программистам и все они задали одинаковый вопрос — будет ли компилятор поддерживать язык  Си++? Мы не ставили перед собой задачу в полном объёме поддерживать современные стандарты этого языка. Однако, при написании синтаксического анализатора, мы активно использовали объектно-ориентированное программироввание — большая часть анализатора реализована с использованием классов. Например, элементы дерева синтаксического разбора — классы. Поскольку первый тест компилятора это тест на возможность собрать из исходного кода самого себя, то наверняка нам придётся поддерживать такую структуру данных как класс. Работа в этом направлении вынудила нас сделать рефакторинг кода, но, к счастью, первоначальный дизайн оказался удачным и нам не пришлось полностью переписывать код.

Enter_To_CPP

На рисунке слева (кликабельный) вы видите результат обработки простейшего «синтетического» примера. В левом столбце оригинальный файл, в правом столбце файл, восстановленный из дерева синтаксического разбора. Это «первая ласточка» — пример класса сознательно упрощен и чуть более сложные конструкции приведут к возникновению «синтаксической ошибки». Это не значит, что разбираемый код содержит ошибку, а лишь то, что код синтаксического анализатора ещё не доработан. Например,  если объявить метод void doh(void) виртуальным, то синтаксический анализатор в нынешнем его осостоянии просто не сможет распознать эту конструкцию. К слову сказать, наш лексический анализатор изначально поддерживает полный набор зарезервированных слов стандарта С++, поэтому он сумеет «переварить» слово «virtual» в лексему.

Следующим этапом мы будем усложнять тестовый пример, внося более сложные конструкции языка C++. Мы решили не приступать к этапу генерации кода до тех пор, пока не удастся поместить весь код компилятора в дерево синтаксического разбора, а затем восстановить обратно в программу на языке С++. Причем, восстановленный код обязан быть корректным с точки зрения других компиляторов. Пока что нет чёткого мнения о подержке исключений, темплейтов и пространства имён. Возможно что реализация этих конструкций будут отложена до «лучших времён».

 


Оставить комментарий