-
pasha_golub © (18.12.08 18:26) [19]
Нет, это вы простите, может быть я чего-то не понимаю. Что с того, что DYacc написан на паскале? Оригинальный yacc тоже на С написан. Но ведь DLex/DYacc генерируют лексер/парсер в виде процедуры на паскале. Затем нужно прикрутить этот парсер к приложению и соответственно затем собрать. Каким это образом его нужно модифицировать, чтобы он выдавал скомпилированный парсер во время выполнения программы по произвольному описанию грамматики?
-
> molto mutevoli (18.12.08 16:02) [14] > oxffff © (18.12.08 15:33) [13] >
> Должно быть, вы не совсем понимаете, что такое Spirit. Он > позволяет задать грамматику языка прямо в исходном коде > (правда не совсем в рантайме, но на дельфи так просто не > получится из-за отсутствия шаблонов и перегрузки операторов,
Хотелось бы обратить внимание, что и перегрузка операторов и параметризованные классы уже есть в Delphi. НО!!! Каким образом наличие этого позволяет легко задать BNF? > поэтому единственный вариант - задавать ее в рантайме, > как например здесь: http://www.codeproject.com/KB/recipes/spart. > aspx), и позволяет полностью интегрировать себя в существующий > исходный код без лишних телодвижений (например, задать обработчики > токенов). Что собственно и хотет открыватель ветки. > Используя же lex и yacc, вы генерируете парсер и интегриуете > его в свое приложение, что может быть далеко не так удобно > (я тоже могу сказать, берите yacc и lex, и пользуйтесь).
Так ничего не машает сенерировать и поключить к проекту код, просто в место задания семантического действия вставить динамический вызов метода по имени некоторого класса(А С++ такое может?) для отвязки обработчика от самого парсера. Или при жесткой связки, вызов конкретного статического метода.
-
> molto mutevoli (18.12.08 19:07) [20]
> > Нет, это вы простите, может быть я чего-то не понимаю. Что > с того, что DYacc написан на паскале? Оригинальный yacc > тоже на С написан. Но ведь DLex/DYacc генерируют лексер/парсер > в виде процедуры на паскале.
В виде класса. Это раз. Далее. Каждый такой класс отличается от другого:
1. Таблицами (переходом, терминальный и нетерминальных символов и прочей другой лабуденью) 2. Реакцией которая будет прописана в yyaction (именно поэтому важно чтобы это был исходник, который впоследствии можно скомпилировать) 3. Вспомогательным кодом
Для решения динамического парсера нам нужны только таблицы. Реакцию мы повесим на какой-нибудь эвент, например OnSymbol.
И что в итоге. DYacc уже имеет таблицы после парсинга, но вместо того чтобы строить исходники, он эти таблицы отдаст в другой класс, который уже по ним и будет разбирать текст, поступающий на вход.
То есть, лишившись возможности программировать реакцию парсера в зависимости от контекста, мы можем без особых затруднений создать динамический парсер.
-
> > 1. Таблицами (переходом, терминальный и нетерминальных символов > и прочей другой лабуденью)
таблицами переходов, терминальных и нетерминальных символов
|