Команда (фрилансеры)

Набираем команду фрилансеров, Вы:

  • Программист,
  • Дизайнер,
  • SEO-специалист,
  • Менеджер

Разработка на заказ

Наша команда фрилансеров выполнит
работы на заказ:

Создание и раскрутка сайтов
Разработка приложений (мобайл, десктоп, сервер)
Разработка игр (веб, мобайл, 3D)
Аутсорсинг, фриланс

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

Рейтинг@Mail.ru

Besucherzahler
счетчик посещений
Сайт на C++
Наш сайт работает на C++ и это очень круто! =))

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)
Новый язык программирования, для разработки веб, мобайл, десктоп-приложений, игр... подробнее...

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

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

Концепция SITEV.ru

SITEV.ru - это социальная сеть для ИТ-специалистов (программистов, дизайнеров, seo-специалистов, рекламных менеджеров, маркетологов), в том числе фрилансеров, бизнесменов... а также обычных пользователей, для которых и делается ИТ

Реклама


Поиск работы по всему миру