Конференция "Прочее" » Простой парсер [D7]
 
  • molto mutevoli (18.12.08 19:07) [20]
    pasha_golub ©   (18.12.08 18:26) [19]

    Нет, это вы простите, может быть я чего-то не понимаю. Что с того, что DYacc написан на паскале? Оригинальный yacc тоже на С написан. Но ведь DLex/DYacc генерируют лексер/парсер в виде процедуры на паскале. Затем нужно прикрутить этот парсер к приложению и соответственно затем собрать.
    Каким это образом его нужно модифицировать, чтобы он выдавал скомпилированный парсер во время выполнения программы по произвольному описанию грамматики?
  • oxffff © (19.12.08 10:17) [21]

    > 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, и пользуйтесь).


    Так ничего не машает сенерировать и поключить к проекту код, просто в место задания семантического действия вставить динамический вызов метода по имени некоторого класса(А С++ такое может?) для отвязки обработчика от самого парсера. Или при жесткой связки, вызов конкретного статического метода.
  • pasha_golub © (19.12.08 15:06) [22]

    > molto mutevoli   (18.12.08 19:07) [20]


    >
    > Нет, это вы простите, может быть я чего-то не понимаю. Что
    > с того, что DYacc написан на паскале? Оригинальный yacc
    > тоже на С написан. Но ведь DLex/DYacc генерируют лексер/парсер
    > в виде процедуры на паскале.


    В виде класса. Это раз. Далее. Каждый такой класс отличается от другого:

    1. Таблицами (переходом, терминальный и нетерминальных символов и прочей другой лабуденью)
    2. Реакцией которая будет прописана в yyaction (именно поэтому важно чтобы это был исходник, который впоследствии можно скомпилировать)
    3. Вспомогательным кодом

    Для решения динамического парсера нам нужны только таблицы. Реакцию мы повесим на какой-нибудь эвент, например OnSymbol.

    И что в итоге. DYacc уже имеет таблицы после парсинга, но вместо того чтобы строить исходники, он эти таблицы отдаст в другой класс, который уже по ним и будет разбирать текст, поступающий на вход.

    То есть, лишившись возможности программировать реакцию парсера в зависимости от контекста, мы можем без особых затруднений создать динамический парсер.
  • pasha_golub © (19.12.08 15:07) [23]

    >
    > 1. Таблицами (переходом, терминальный и нетерминальных символов
    > и прочей другой лабуденью)

    таблицами переходов, терминальных и нетерминальных символов
 
Конференция "Прочее" » Простой парсер [D7]
Есть новые Нет новых   [134449   +17][b:0][p:0]