Обычный шаблон - парсер запрашивает токены. Цикл синтаксического анализатора обычно имеет форму «прочитать следующий токен, определить, что с ним делать, обновить частично проанализированное дерево, повторить», и этого легче достичь, если синтаксический анализатор вызывает сам лексер (вместо третьего фрагмента кода, считываемого из лексер и фидеры для парсера).
Конечно, сердце парсера зависит от алгоритма, который вы используете (рекурсивное снижение, LR ...), но обычно он состоит в определении того, соответствует ли новый токен правилу, которое вы сейчас анализируете (например, поиск -
при чтении EXPR = '-' EXPR | ...
), соответствует подправилу (например, поиск class
при чтении DEF = CLASS | ...
, например, CLASS = 'class' ...
) или не подходит вообще (с этого момента вы должны прекратить действие текущего правила) , создав соответствующий узел AST и повторив процесс на родительском правиле).
Парсеры рекурсивного спуска делают это с под-вызовами (для подправил) и с возвращаемыми значениями (для возврата к родительскому правилу), в то время как парсеры RL имеют тенденцию объединять несколько правил и подправил в одно и shift , чтобы остаться в текущем наборе правил, или уменьшить , чтобы прекратить действие правил и построить один или несколько узлов AST.