Что такое повторяющийся парсер?
Может кто-то объяснить это мне? В частности разница между:
http://github.com/whymirror/greg и http://piumarta.com/software/peg/
Первый является вернувшейся версией позднего.
2 ответа
В простейшем случае анализатор с повторным входом не использует глобальные переменные и, следовательно, может иметь несколько активных экземпляров одновременно (необязательно связанных с многопоточностью, но я подозреваю, что это основной вариант использования).
Однако в более сложных случаях вы можете использовать синтаксический анализатор, который фактически анализирует несколько языков в одном исходном документе. Например, рассмотрим анализатор JSP, который должен анализировать код Java и HTML в одном файле. Вместо создания одного огромного парсера, охватывающего оба языка (что, вероятно, весьма непрактично), вы можете создать два парсера и переключаться между ними. Однако, если ваши парсеры используют глобальное состояние, переключение между ними может быть проблематичным. Повторно входящий синтаксический анализатор позволяет вам легко переключаться между синтаксическими анализаторами, либо в форме сопрограмм, либо в простых "parser-A вызывает parser-B для встроенного кода, а затем возвращает" ситуации.
Отредактировано, чтобы добавить:
Если вы хотите экстремальную форму повторного ввода, взгляните на комбинаторы синтаксического анализа (например, Parsec), где каждое подвыражение в "грамматике" является отдельным анализатором полностью. Вы создаете большой парсер, комбинируя множество маленьких.
Чтобы быть реентерабельным, компьютерная программа или рутина:
- Не должен содержать статических (или глобальных) непостоянных данных.
- Не должен возвращать адрес статическим (или глобальным) непостоянным данным.
- Должен работать только на данных, предоставленных ему вызывающей стороной.
- Не должен полагаться на блокировки одноэлементных ресурсов.
Не обязательно связано с безопасностью потоков, но анализирует несколько грамматик в документе.