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

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

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

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

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

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

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

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

Пример:

int x = 1; 

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

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

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

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

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

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

  • Tokenizer также удалит любые комментарии и только вернет токены в Lexer.
  • Lexer также будет определять области для этих токенов (переменных / функций)
  • Затем Parser построит структуру кода / программы
  • Строка parse для DateTime в C #
  • Casting vs Преобразование объекта toString, когда объект действительно является строкой
  • Логическое выражение (грамматика) в c ++
  • Как получить ответ как String с использованием модификации без использования GSON или любой другой библиотеки в android
  • Как разобрать строку с десятичной точкой в ​​double?
  • Как я могу разобрать этот JSON в Android?
  • Как я могу разбирать строку в BigDecimal?
  • NetworkOnMainThread
  • Каков наилучший способ parsingа форматированного файла с фиксированной шириной в Java?
  • Java отрицательный int для шестнадцатеричного и обратного сбоев
  • В чем разница между деревом parsingа и АСТ?
  • Interesting Posts

    Переместите пользовательский каталог Windows 7 в D: \ user

    Microsoft Office 2007 – недостаточно памяти для открытия Word

    Обновление отношений при сохранении изменений объектов EF4 POCO

    Удаление отображения имен строк из фрейма данных

    Как проанализировать аргументы командной строки в Bash?

    Как выполнить запуск плагина maven непосредственно из командной строки?

    Как веб-браузер всегда отправляет конечную косую черту после имени домена?

    Сбой при выдаче результата arc4random () в Int

    React-router с BrowserRouter / browserHistory не работает при обновлении

    Как решить maven 2.6 зависимость плагина ресурса?

    Opera 31: удалить поисковые системы по умолчанию?

    Воспроизведение аудио с низкой задержкой на Android

    Как проверить, упорядочен ли список?

    Можно ли общаться с другими пользователями WiFi в доме?

    C ++, получение миллисекундного времени на Linux – clock (), похоже, не работает должным образом

    Давайте будем гением компьютера.