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

Цель: пассивный доход 100 тыс. руб. в мес.

Задачи:

  1. Разработка языка Cj
  2. ...
  3. ...


Также в блоге: изучаем и разрабатываем что-то новое, делимся опытом.

Подписывайтесь:
Cj - язык программирования

Новый язык программирования, для разработки сайтов и приложений, подробнее...


Спецификация:

  1. Комментарии
  2. Типы данных, переменные, функции
  3. ...

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 };

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

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


Отправить комментарий
Контакты
vk.com/sitev_ru
Skype: sitev.ru
E-mail: mike@sitev.ru
github.com/sitev

Рейтинг@Mail.ru

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