Является ли слово «лексер» синонимом слова «парсер»? - PullRequest
7 голосов
/ 09 мая 2011

Название вопроса: синонимы слов «лексер» и «синтаксический анализатор» или они разные?Кажется, что Википедия использует слова взаимозаменяемо, но английский не является моим родным языком, поэтому я не уверен.

Ответы [ 5 ]

8 голосов
/ 09 мая 2011

Лексер используется для разделения входных данных на токены, тогда как синтаксический анализатор используется для построения абстрактного синтаксического дерева из этой последовательности токенов.

Теперь вы можете просто сказать, что токены являются просто символамии использовать синтаксический анализатор напрямую, но часто бывает удобно иметь анализатор, который должен просматривать только один токен, чтобы определить, что он собирается делать дальше.Поэтому лексер обычно используется для разделения ввода на токены до того, как синтаксический анализатор его увидит.

Лексер обычно описывается с использованием простых правил регулярного выражения, которые проверяются по порядку.Существуют такие инструменты, как lex, которые могут автоматически генерировать лексеры из такого описания.

[0-9]+  Number
[A-Z]+  Identifier
+       Plus

С другой стороны, синтаксический анализатор обычно описывается указанием грамматики .Опять же, существуют такие инструменты, как yacc, которые могут генерировать парсеры из такого описания.

expr ::= expr Plus expr
       | Number
       | Identifier  
7 голосов
/ 09 мая 2011

Нет.Lexer разбивает входной поток на «слова»;парсер обнаруживает синтаксическую структуру между такими «словами».Например, данный вход:

velocity = path / time;

Выход лексера:

velocity (identifier)
= (assignment operator)
path (identifier)
/ (binary operator)
time (identifier)
; (statement separator)

, и тогда анализатор может установить следующую структуру:

= (assign)
  lvalue: velocity
  rvalue: result of
    / (division)
      dividend: contents of variable "path"
      divisor: contents of variable "time"
6 голосов
/ 09 мая 2011

Нет. Лексер разбивает исходный текст на токены, тогда как парсер интерпретирует последовательность токенов соответствующим образом.

3 голосов
/ 09 мая 2011

Они разные.

Лексер принимает поток входных символов в качестве входных данных и выдает токены (также известные как лексемы) в качестве выходных данных.

Анализатор принимает токены (лексемы) в качестве входных данных и создает (например) абстрактное синтаксическое дерево, представляющее операторы.

Однако оба достаточно похожи, так что довольно много людей (особенно те, кто никогда не писал ничего подобного компилятору или интерпретатору) относятся к ним одинаково или (чаще) используют «парсер», когда они действительно значит "лексер".

1 голос
/ 09 мая 2011

Насколько я знаю, лексер и парсер по смыслу связаны, но не являются точными синонимами.Хотя многие источники используют их как сходные, лексер (сокращение от лексического анализатора) идентифицирует токены, относящиеся к языку из входных данных;в то время как анализаторы определяют, соответствует ли поток токенов грамматике рассматриваемого языка.

...