ВУЗ:
Составители:
66
12. ПОСТРОЕНИЕ ТАБЛИЧНО-УПРАВЛЯЕМОЙ
ПРОГРАММЫ ГРАММАТИЧЕСКОГО РАЗБОРА
Конкретные грамматики задаются таблично-управляемой
универсальной программе в виде исходных данных, предшествующих
предложениям, которые нужно разобрать. Универсальная программа
работает в строгом соответствии с методом простого нисходящего
грамматического разбора; поэтому она довольно проста, если основана на
детерминированном синтаксическом графе, т.е. если предложения можно
анализировать с просмотром вперед на один символ без
возврата.
В данном случае грамматика (предположим, что она представлена в
виде детерминированного множества синтаксических графов) преобразуется
в подходящую структуру данных, а не в структуру программы. Естественный
способ представить граф – это ввести узел для каждого символа и связать эти
узлы с помощью ссылок. Следовательно, "таблица" – это не просто массив.
Узлы этой
структуры представляют собой структуры (struct) с
объединениями (union). Объединение позволяет идентифицировать тип
узла. Первый идентифицируется терминальным символом, который он
обозначает (tsym), второй – ссылкой на структуру данных, представляющую
соответствующий нетерминальный символ (nsym). Оба варианта
объединения содержат две ссылки: одна указывает на следующий символ,
последователь (suc), а другая связана со списком возможных альтернатив
(alt). Графически узел можно изобразить следующим образом
sym
sucalt
Также нужен элемент, представляющий пустую последовательность,
символ "пусто". Обозначим его с помощью терминального элемента,
называемого empty.
struct node;
typedef node *pointer;
struct node {
66
12. ПОСТРОЕНИЕ ТАБЛИЧНО-УПРАВЛЯЕМОЙ
ПРОГРАММЫ ГРАММАТИЧЕСКОГО РАЗБОРА
Конкретные грамматики задаются таблично-управляемой
универсальной программе в виде исходных данных, предшествующих
предложениям, которые нужно разобрать. Универсальная программа
работает в строгом соответствии с методом простого нисходящего
грамматического разбора; поэтому она довольно проста, если основана на
детерминированном синтаксическом графе, т.е. если предложения можно
анализировать с просмотром вперед на один символ без возврата.
В данном случае грамматика (предположим, что она представлена в
виде детерминированного множества синтаксических графов) преобразуется
в подходящую структуру данных, а не в структуру программы. Естественный
способ представить граф – это ввести узел для каждого символа и связать эти
узлы с помощью ссылок. Следовательно, "таблица" – это не просто массив.
Узлы этой структуры представляют собой структуры (struct) с
объединениями (union). Объединение позволяет идентифицировать тип
узла. Первый идентифицируется терминальным символом, который он
обозначает (tsym), второй – ссылкой на структуру данных, представляющую
соответствующий нетерминальный символ (nsym). Оба варианта
объединения содержат две ссылки: одна указывает на следующий символ,
последователь (suc), а другая связана со списком возможных альтернатив
(alt). Графически узел можно изобразить следующим образом
sym
alt suc
Также нужен элемент, представляющий пустую последовательность,
символ "пусто". Обозначим его с помощью терминального элемента,
называемого empty.
struct node;
typedef node *pointer;
struct node {
Страницы
- « первая
- ‹ предыдущая
- …
- 64
- 65
- 66
- 67
- 68
- …
- следующая ›
- последняя »
