Генераторы анализатора и Рагль ... Сделать свой собственный диапазон D

StackOverflow https://stackoverflow.com/questions/4719427

  •  12-10-2019
  •  | 
  •  

Вопрос

Я новичок в мире компиляторов, и я недавно слышал о том, что называется генератором синтаксического анализатора. Из того, что я (думаю), я понял, генераторы синтаксиса принимают синтаксис и вывод исходного кода, который может анализировать файлы с помощью данного синтаксиса.

Несколько вопросов:

  1. Я правильно это понял?

  2. Если да, то Рагль такой инструмент?

  3. Если это так, может ли Ragel вывести анализатор D в исходный код D?

Благодарю вас!

Это было полезно?

Решение

  1. Это в основном. Генераторы синтаксического анализатора преобразуют грамматику в исходный файл, который можно использовать для распознавания строк, которые являются членами язык определяется грамматикой. Часто, но не всегда, генератор анализатора требует лексического анализатора, чтобы разбить текст на токены, прежде чем он выполнит свою работу. Лекс и якк Классические примеры парного лексического анализатора и генератора анализатора.

    Современные генераторы анализатора предлагают дополнительные функции. Например, Antlr может генерировать код для лексического анализа, грамматического анализа и даже пройти сгенерированное абстрактное синтаксисное дерево. Элханс генерирует анализатор, который использует Глина Алгоритм диапазона. Это позволяет ему распознавать более широкий спектр языков, чем негенерализованные алгоритмы анализа. Пег -анализаторы Не требует отдельного лексического анализатора.

  2. Рагль фактически генерирует лексический анализатор в виде конечного состояния машины. Он может распознать обычный язык но не Context-Free язык. Это означает, что он не может распознать большинство языков программирования, включая D.

  3. Ragel действительно генерирует код D, если вам нужен быстрый лексический анализатор.

Чтобы полностью понять, что для вас делает генератор анализатора, вам понадобится какой -то формальный язык и теорию анализа. Есть худшие места для начала, чем Книга дракона. Анкет Смотрите также: Научиться писать компилятор.

Если вы чувствуете себя смелым, обязательно ознакомьтесь с кодом Lexing и Saclsing, распределенным с помощью компилятора DMD -/DMD2/SRC/DMD/ - lexer.c и parse.c.

Другие советы

Хотя Рагель основан на регулярных выражениях, это не просто Генератор FSM Regex. Это позволяет рекурсию, используя дополнительный синтаксис вызовов/возврата, а также другие функции, которые позволяют анализировать нерегулярные языки. Таким образом, в то время как Ragel действительно генерирует FSM, он позволяет генерировать несколько различных FSM и предоставляет механизмы прыжка между ними в произвольных точках или с использованием синтаксиса специального транспорта машин. Это также позволяет выполнять произвольный код при государственных переходах.

Еще одна вещь, которая делает Ragel уникальным, заключается в том, что он онлайн. Другими словами, это легко использовать для сканирования данных из асинхронного источника, такого как не блокирующая розетка. Он также не использует динамические ресурсы, за исключением того, что для вызова/возврата вы можете использовать либо статическую, автоматическую или динамическую память для стека; как вы хотите. Там тоже нет глобального государства.

Рагль совершенно уникален. В отличие от большинства (все?) Традиционные генераторы, это было сделано для сетевого программирования.

Может быть:

Mysourcecode -> (сканер) -> myscannerdatafile myscannerdatafile -> (parser) -> myparserdatafile myparserdatafile -> (codegenerator) -> myexecutablefile

или же:

Mysourcecode -> (scannerandparser) -> myscannerandparserdatafile myscannerandparserdatafile -> (codegenerator) -> myexecutablefile

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top