Блог программиста

Опытный программист не только делится этим самым опытом, но и сам изучает что-то новое в сфере программирования и ИТ в целом и рассказывает об этом посетителям сайта!

Parser - синтаксический анализатор

В предыдущей статье мы рассмотрели, как написать лексер. Теперь переходим, пожалуй, к самой сложной составляющей компилятора - синтаксическому анализатору.

Давайте сразу разобьём парсер на два класса. Первый будет абстрактным парсером, поместим его в библиотеку lang.

class Parser {
protected:
	vector nodes;
public:
	Parser(Lexer *lexer);
	virtual Str run(Str s) = 0;
	virtual Token getToken();
	virtual void savePosition();
	virtual void savePosition(int &savePos);
	virtual void rollback();
	virtual void rollback(int savePos);
};

Как мы видим из кода, основную функцию парсера run() универсально реализовать невозможно. Её нужно затачивать под конкретный язык программирования. Поэтому сделаем её абстрактной.

Функции savePosition() и rollback() помогут нам сохранять текущую позицию и откатывать назад, если нужно.

С этим же смыслом реализована getToken(). За основу взята и переделана getToken() так, чтобы после отката считывать токены с сохранённой позиции.

Ну вот почти и всё... Хотя мы забыли про самое главное - про синтаксическое дерево vector nodes.

Как мы уже видим, дерево состоит из узлов. Опишем общий класс:

class Node {
public:
	NodeType nt;
	vector nodes;
	Node();
};

Как мы видим, каждый узел содержит тип и список дочерних узлов. Поддерживать мы будем, на данный момент, только следующие типы узлов:

enum NodeType { ntNone, ntNumber, ntVarDef, ntVar, ntFuncDef, ntFunc, ntOper };

Под каждый тип придётся описать свой класс.

У нас получился некий абстрактный синтаксический анализатор. Его можно применять для написания парсеров любых языков программирования. Следующий этап - написать парсер под свой язык. А вот это на порядок сложнее и, видимо, посвятим этому не один пост!


Отправить комментарий
Наш проект: язык Cj
Cj - язык программирования (C++ & Javascript)
Новый язык программирования, для разработки веб, мобайл, десктоп-приложений, игр... подробнее...

Хотите поддержать проект?

  • Оставляйте ссылки на наш сайт
  • Станьте спонсором проекта
подробнее...

Контакты
vk.com/sitev_ru
Skype: sitev.ru
E-mail: mike@sitev.ru
github.com/sitev

Рейтинг@Mail.ru

Besucherzahler
счетчик посещений