Изменения

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

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

637 байт добавлено, 20:58, 25 мая 2015
Общая схема построения рекурсивных парсеров с помощью FIRST и FOLLOW
Node res = Node("A")
'''switch''' (curToken) : <font color="green">// принимаем решение в зависимости от текущего токена строки</font>
'''case''' <tex>\mathrm{FIRST}(\alpha_1) \cup (\mathrm{FOLLOW}(A)\ \mathrm{if}\ setminus \varepsilon \in \mathrm{FIRST}(\alpha_1))</tex> :
<font color="green">// <tex>\alpha_1 = X_1X_2 \ldots X_{t}</tex> </font>
'''for''' i = 1 .. t
res.addChild(t)
'''break'''
'''case''' <tex>\mathrm{FIRST}(\alpha_2) \cup (\mathrm{FOLLOW}(A)\ \mathrm{if}\ setminus \varepsilon \in \mathrm{FIRST}(\alpha_2))</tex> :
<tex>\ldots</tex>
'''break'''
<tex>\ldots</tex>
'''case''' <tex>\mathrm{FIRST}(\alpha_k) \setminus \varepsilon</tex> :
<tex>\ldots</tex>
'''break'''
'''case''' <tex>\mathrm{FOLLOW}(A)\ \mathrm{if}\ \exists i : \varepsilon \in \mathrm{FIRST}(\alpha_i)</tex>
res.addChild(Node(<tex>\varepsilon</tex>)) <font color="green">// в этом случае нетерминал раскрывается в <tex>\varepsilon</tex>; можно не добавлять детей к <tex>\mathtt{res}</tex>,</font>
'''break''' <font color="green">// подразумевая, что если у нетерминала <tex>0</tex> детей, то было использовано <tex>\varepsilon</tex>-правило</font>
'''default''' :
<font color="red">error</font>("unexpected char")

Навигация