Re[5]: Theory and Techniques of Compiler Construction
От: mefrill Россия  
Дата: 19.07.05 06:23
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ну, трешка похоже просто будет практически идеальным построителем парсеров. А 2.х просто довольно мощьный продукт. А есть там много чего. Декларативное заглядывание вперед (правда становится не актуальным в следующей версии). Декларативное построение АСТ. EBNF. Автоматическое пуравление памятью (ну, это скорее Ява себя проявляет).


Это-то да. Но я спрашивал в свете недавнего обсуждения возможности раширения LL(k)-анализатора так, чтобы он имел возможно разбирать параллельно альтернативы, даже если они не укладываются в LL(k) для любого, сколь угодно большого k. Кто-то, не помню кто, дал ссылку на третью версию ANTLR. Я пошел по ссылке, прочитал кучу блогов, но сумел вынести оттуда только одно: ничего про параллельный разбор там нет и единственное улучшение — это использование регулярных выражений в предосмортрах. Идея это не новая, придумана была еще в 60-х годах. Суть ее такова: вместо использования конкретной строки длиной 1 или два символа в качестве предосмотра, использовать класс строк, вводимых с помощью регулярных выражений. Как известно, в LL(k)-анализе практически единственным способом различений контекста является исползование предосмотров. Например, в грамматике

A --> B | C
B --> NUMBER D
C --> STRING D

мы можем выбрать, какую альтернативу для разбора символа A использовать, заглянув на один симовл вперед. Если этот символ есть NUMBER, то выбираем A --> B, если STRING, то выбираем A --> C, если ни то ни другое — возвращаем ошибку. Проблема возникает, когда мы имеем грамматику типа

A --> B | C
B --> NUMBER D
C --> NUMBER D
D --> STRING E
D --> '+' E

Здесь уже LL(1) не подойдет, надо знать два символа впереди, чтобы различить альтернативы A --> B и A --> C. Так вот, а если попытаться вместо конкреных строк предостмотров использовать регулярные выражения как множество строк? Было бы удобно, хотя совершенно не увеличило бы мощность разборщика. Кроме того, сами правила тоже можно представить посредством регулярного выражения, т.е. автомата, и, тем самым, улучшить скорость разборщика. Конечно, надо еще, чтобы сами правила имели такой, "регулярный" вид. Я, конечно, могу ошибаться, просмотрел документы по ссылкам мельком и мог неправильно понять, но улучшения синтаксического анализатора я там не увидел. Вообще, наряду я вненсениям последних достижений теории компиляции в генератор, разработчики ANTLR не хотят использовать последние достижения в области синтаксического анализа. Это, несомненно, обедняет систему. Класс языков, который может быть разобран с помощью этого инструмента, сейчас уже совершенно неудовлетворителен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.