Ищете четкое определение того, что такое «токенизатор», «парсер» и «лексеры» и как они связаны друг с другом и используются? - PullRequest
125 голосов
/ 19 декабря 2008

Я ищу четкое определение того, что такое "токенизатор", "парсер" и "лексер" и как они связаны друг с другом (например, использует ли парсер токенизатор или наоборот)? Мне нужно, чтобы программа прошла через исходные файлы c / h для извлечения декларации данных и определений.

Я искал примеры и могу найти некоторую информацию, но я действительно изо всех сил пытался понять основные понятия, такие как грамматические правила, деревья разбора и абстрактное синтаксическое дерево и как они взаимосвязаны друг с другом. В конечном итоге эти концепции необходимо сохранить в реальной программе, но 1) как они выглядят, 2) существуют ли общие реализации.

Я смотрел на Википедию по таким темам и программам, как Lex и Yacc, но никогда не изучал класс компиляторов (EE Major), мне трудно полностью понять, что происходит.

Ответы [ 4 ]

139 голосов
/ 19 декабря 2008

Токенизатор разбивает поток текста на токены, обычно путем поиска пробелов (табуляции, пробелов, новых строк).

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

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

В последний раз, когда я проверял, лучшей книгой по этому предмету была "Компиляторы: принципы, методы и инструменты" , обычно известная как "Книга Дракона".

14 голосов
/ 26 марта 2009

Пример:

int x = 1;

Лексер или токенизер разделит это на токены 'int', 'x', '=', '1', ';'.

Парсер возьмет эти токены и использует их для некоторого понимания:

  • у нас есть заявление
  • это определение целого числа
  • целое число называется 'x'
  • 'x' должен быть инициализирован значением 1
4 голосов
/ 19 декабря 2008

Я бы сказал, что лексер и токенизатор - это одно и то же, и они разбивают текст на составляющие его части («токены»). Затем парсер интерпретирует токены с помощью грамматики.

Я бы не стал слишком зацикливаться на точном терминологическом использовании - люди часто используют «разбор», чтобы описать любое действие по интерпретации комка текста.

1 голос
/ 09 марта 2017

( добавление к данным ответам )

  • Tokenizer также удалит любые комментарии и вернет только токенов в Lexer.
  • Lexer будет также определять области действия для этих токенов (переменных / функций)
  • Парсер затем создаст структуру кода / программы
...