Ищете четкое определение того, что такое «токенизатор», «парсер» и «лексеры» и как они связаны друг с другом и используются?
Я ищу четкое определение того, что такое «токенизатор», «парсер» и «лексер» и как они связаны друг с другом (например, использует ли парсер токенизатор или наоборот)? Мне нужно создать программу, которая будет проходить через исходные файлы c / h, чтобы извлечь декларацию и определения данных.
Я искал примеры и могу найти некоторую информацию, но я действительно пытаюсь понять основные понятия, такие как правила грамматики, деревья синтаксического анализа и абстрактное синтаксическое дерево и то, как они взаимосвязаны друг с другом. В конце концов эти концепции должны быть сохранены в реальной программе, но 1) как они выглядят, 2) существуют общие реализации.
Я рассматриваю Википедию по этим темам и программам, таким как Lex и Yacc, но никогда не проходил class компилятора (EE major). Мне трудно понять, что происходит.
- Почему C ++ не может быть проанализирован парсером LR (1)?
- Как сделать Integer.parseInt () для десятичного числа?
- Как разобрать JSON в Android?
- Импортировать CSV-файл со смешанными типами данных
- Как определить, является ли строка числом?
- Дата синтаксиса в Bash
- Java: parse java исходный код, методы извлечения
- Есть ли Java XML API, который может анализировать документ без разрешения объектов символов?
- Как анализировать математическое выражение, заданное как строку, и возвращать число?
- Используемый парсер Улица Адрес, Город, Штат, Почтовый индекс из строки
- Лучший способ разобрать поплавок?
- Прочитайте и проанализируйте Json-файл в C #
- Безопасная строка для преобразования BigDecimal
Токенизатор разбивает stream текста на токены, обычно, просматривая пробелы (вкладки, пробелы, новые строки).
Лексер в основном является токенизатором, но обычно он прикрепляет дополнительный контекст к токенам – этот токен является числом, этот токен является строковым литералом, этот другой токен является оператором равенства.
Парсер берет stream токенов из лексера и превращает его в абстрактное синтаксическое дерево, представляющее (обычно) программу, представленную исходным текстом.
Последнее, что я проверил, – лучшая книга по теме «Компиляторы: принципы, методы и инструменты», обычно называемые «Книга дракона».
Пример:
int x = 1;
Лексер или токенизер разделят это на токены ‘int’, ‘x’, ‘=’, ‘1’, ‘;’.
Парсер будет принимать эти жетоны и использовать их для понимания в некотором роде:
- у нас есть заявление
- это определение целого числа
- целое число называется ‘x’
- ‘x’ должен быть инициализирован значением 1
Я бы сказал, что лексер и токенизатор в основном одно и то же, и что они разбивают текст на его составные части («токены»). Затем анализатор интерпретирует токены, используя грамматику.
Я бы не стал слишком зависеть от точного терминологического использования, хотя – люди часто используют «синтаксический анализ» для описания любого действия интерпретации текста текста.
( добавление к данным ответам )
- Tokenizer также удалит любые комментарии и только вернет токены в Lexer.
- Lexer также будет определять области для этих токенов (переменных / функций)
- Затем Parser построит структуру кода / программы