Изменения
→Общая схема построения рекурсивных парсеров с помощью FIRST и FOLLOW
== Общая схема построения рекурсивных парсеров с помощью FIRST и FOLLOW ==
Пусть <tex>\Gamma=\langle \Sigma, N, S, P \rangle</tex> {{---}} LL(1)-грамматика. Построим для нее парсер.
Для каждого нетерминала <tex>A</tex> : <tex>A \rightarrow \alpha_1 \mid \alpha_2 \mid ... \ldots \mid \alpha_k </tex> создадим функцию <tex> \mathtt{A}() : \mathtt{Node} </tex>, возвращающую фрагмент дерева разбора, выведенный из нетерминала <tex>A</tex>.
Здесь <tex>\mathtt{Node }</tex> {{---}} структура следующего вида: '''struct''' Node children : '''list<Node>''' value : '''string ''' <font color="green">// имя нетерминала или текст терминала</font> '''function''' addChild('''Node''') <font color="green">// функция, подвешивающая поддерево к данному узлу</font>
Каждый момент времени парсер работает с определённым '''токеном''' (англ. ''token'') входного слово <tex>s</tex>. Токен {{---}} один или несколько нетерминалов, для удобства объединяемые по смыслу в одну логическую единицы. Примерами токенов могут выступать следующие лексические единицы:
* произвольный символ <tex> c </tex>,
* целое слово, например <tex> public </tex>,
* число со знаком, обозначаемое далее для краткости как <tex> n </tex>,
В общем случае, токеном может являться любое слово, удовлетворяющее произвольному [[Регулярные языки: два определения и их эквивалентность | регулярному выражению]].
[[Файл:string_token.png|300px]]
...
'''break'''
...
'''default ''' : <font color="red">error</font>("unexpected char") '''return ''' res
'''function''' consume(c: '''char c''') '''if (''' curToken != c) <font color="red">error</font>("expected" + c)
nextToken()