Изменения

Перейти к: навигация, поиск

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

319 байт убрано, 15:54, 24 мая 2015
Нет описания правки
Здесь 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
== Пример ==
Построим функции обработки некоторых нетерминалов.
E() res = Node("E") switch(curToken) case 'n', '(' : res.addChild(T()) res.addChild(E'()) break default : error("unexpected char") return res
consume(char c) if (curToken != c) error("expected" + c) nextToken()
E'() res = Node("E'") switch(curToken) case '+' : consume('+') nextToken() res.addChild(Node("+")) res.addChild(T()) res.addChild(E'()) break case '$', ')' : break default : error("unexpected char") return res
F() res = Node("F") switch(curToken) case 'n' : if consume(curToken != 'n') error("expected n") nextToken() res.addChild(Node("n")) break case '(' : consume('(') res.addChild(Node("(")) res.addChild(E()) consume(')') res.addChild(Node(")")) default : error("unexpected char") return res
Функции для T и T' строятся аналогично.
Анонимный участник

Навигация