Предиктивный синтаксический анализ

Материал из Викиконспекты
Перейти к: навигация, поиск
Эта статья находится в разработке!

Общая схема построения парсеров с помощью FIRST и FOLLOW

Для LL(1) грамматик возможна автоматическая генерация парсеров, если известны множества FIRST и FOLLOW. Существуют общедоступные генераторы: ANTLR, GNU bison, Yacc.

Пусть [math]\Gamma[/math] — LL(1)-грамматика. Построим для нее парсер.

Для каждого нетерминала A : [math]A \rightarrow \alpha_1 | \alpha_2 | ... | \alpha_k [/math] создадим функцию A() : Node, возвращающую фрагмент дерева разбора, выведенный из нетерминала A.

Здесь Node — структура вида:

   Node
       children : list<Node>
       value : string

Тут картинка про строку.

   A() : Node
       res = Node("A")
       switch (curToken) :
           case : FIRST(\alpha_1) :
               // \alpha_1 = X_1x_2..x_{t_1}
               // X_1 — нетерминал
               Node t = X_1()
               res.addChild(t)
               // x_2 — терминал
               if (curToken != x_2)
                   error("expected x_2")
               res.addChild(new Node("x_2")
               nextToken()
               // x_3 
               ...
               break;
           case FIRST(\alpha_2) :
               // \varepsilon \in FIRST(\alpha_2)
           case FOLLOW(A) :
               ...
               break;
           ...
           default :
               error("unexpected char")
       return res


TODO: Примеры псевдокодов для грамматики арифметических выражений

TODO: Картинки примеров разбора чего-нибудь типа 1+2*3

TODO: Построение таблицы предиктивного анализа