subsection Описание синтаксиса библиотеки large Описание синтаксиса би

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
\subsection[Описание синтаксиса библиотеки]{\large Описание синтаксиса библиотеки}
\hspace{\parindent}
В библиотеке с помощью шаблонов реализованы такие типы как: Term, соответствующий терминальным символам, NTerm --- нетерминальным символам, которые могут иметь или не иметь атрибут, и Rule, являющийся маркером начала правила. Также в библиотеке перегружены операторы <{}< и |. Первый используется для формирования правила, второй позволяет определять несколько правил для одного нетерминального символа. К тому же в библиотеке присутствует класс Lexer<Тип токена>, который нужен для того, чтобы осужествлять лексический анализ. Для того, чтобы реализовать библиотеку, понадобилось к тому же несколько промежуточных типов.\\\indent
Итак, нетерминалы типа NTerm задаются с помощью правил вида:\\\indent
NTerm<Тип токена, тип атрибута> Нетерминал = Альтернатива | Альтернатива | ...;\\\indent
где тип токена - это перечисление, состоящее из тэгов терминальных символов. Тип атрибута - это тип атрибута нетерминала (число или указатель на дерево разбора и т. д.) или просто void, если атрибута нет. Нетерминал - это имя нетерминала, глобальная переменная.
Альтернатива - это правило, задающееся в виде:\\\indent
Rule() <{}< элемент <{}< элемент... [<{}< функция обработки],\\\indent
где Rule() - это маркер начала правила, а элементом может быть нетерминал или терминал. У терминала также может быть атрибут, тогда терминал задаётся в виде:\\\indent
Term<тип атрибута>(значение типа токена),\\\indent
а может и не быть, тогда терминал просто задаётся значением типа токена.\\\indent
Функция обработки должна возвращать значение типа атрибута нетерминала и принимать значения атрибутов, представленных в данной альтернативе (как нетерминалами с непустым типом атрибута, так и терминалами с атрибутами). Функция обработки может отсутствовать, если нетерминал имеет пустой (void) атрибут и элементы в альтернативе атрибутов не несут, или если нетерминал имеет непустой атрибут и только один элемент несёт атрибут, причём типы атрибутов должны совпадать. Атрибут нетерминала получает значение атрибута элемента.\\\indent
Класс Lexer<Тип токена>где тип токена - это перечисление, от которого пользователь должен унаследовать свой класс, осуществляющий лексический анализ входной последовательности символов. В этом классе должен быть переопределён виртуальный метод класса