Лексер используется для разделения входных данных на токены, тогда как синтаксический анализатор используется для построения абстрактного синтаксического дерева из этой последовательности токенов.
Теперь вы можете просто сказать, что токены являются просто символамии использовать синтаксический анализатор напрямую, но часто бывает удобно иметь анализатор, который должен просматривать только один токен, чтобы определить, что он собирается делать дальше.Поэтому лексер обычно используется для разделения ввода на токены до того, как синтаксический анализатор его увидит.
Лексер обычно описывается с использованием простых правил регулярного выражения, которые проверяются по порядку.Существуют такие инструменты, как lex
, которые могут автоматически генерировать лексеры из такого описания.
[0-9]+ Number
[A-Z]+ Identifier
+ Plus
С другой стороны, синтаксический анализатор обычно описывается указанием грамматики .Опять же, существуют такие инструменты, как yacc
, которые могут генерировать парсеры из такого описания.
expr ::= expr Plus expr
| Number
| Identifier