Ищете четкое определение того, что такое "токенизатор", "парсер" и "лексеры" и как они связаны друг с другом и используются?

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

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

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

Ответ 1

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

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

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

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

Ответ 2

Пример:

int x = 1;

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

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

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

Ответ 3

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

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

Ответ 4

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

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