Первый блин - комом.

August 17th, 2007

Нахваливал я тут PLY, а зря. Разбор двух с половиной мегабайтного заголовка с построением синтаксического дерева занимает верных полторы минуты. И это на AMD Opteron 250 2.4GHz. Эталонный Althon XP, по всей видимости, будет делать то же самое минут десять. Это никуда не годиться.

В профайлере наблюдается вот такая картина:

Profiler output

Время съедает непосредственно разбор, а не анализ результатов разбора и создание синтаксического дерева. Python-ая природа PLY сделала свое черное дело. :-)

Вариантов видится пока два:

  1. Портировать парсер на С++ и GNU Bison;
  2. Разобраться таки с DParser.

Второй вариант намного предпочтительнее, так как всю логику можно будет по-прежнему писать на Python.

  1. August 18th, 2007 at 03:44 | #1

    Почитал про DParser, понравилось… А что с ним под виндоус происходит? Нет машины дома протестировать, к сожалению :/.

  2. August 18th, 2007 at 11:37 | #2

    По-моему это все “из пушки по воробьям” :)
    Для C надо тогда делать еще полноценный препроцессор — не проще ли, если предполагается парсить только пару-тройку определенных заголовочных файлов из platform SDK, все сделать на тупых регулярных выражениях?

  3. August 18th, 2007 at 16:35 | #3

     

    Почитал про DParser, понравилось… А что с ним под виндоус происходит?

    Он не собирается в Visual C++ 2005 без дополнительных телодвижений. Я на днях опубликую рецепт.

    Для C надо тогда делать еще полноценный препроцессор

    Проще взять готовый. cl.exe подойдёт. :-)

    предполагается парсить только пару-тройку определенных заголовочных файлов из platform SDK, все сделать на тупых регулярных выражениях?

    Проще. Но хочеться:
     а. Красиво;
     б. Что б наверняка.

    Кроме того, по трудоёмкости оба способа не сильно отличаются на самом деле.

  4. August 20th, 2007 at 08:03 | #4

    если PLY - полный аналог Lex/Yacc (Flex/Bison), то время разбора (имеется ввиду стадия лексического анализа, а не синтаксического) также сильно зависит от набора регулярных выражений, которые осуществляют распознавание токенов. Можно попробовать каким либо образом их оптимизировать. Например:

    letter [A-Za-z]
    word letter+

    {word} {
    return hashfunc(matchedtext);
    }

    т.е. распознавать все ключевые слова при помощи одного правила, а тип лексемы определять при помощи хэш-функции (которую тоже к стати можно сгенерировать - для С++ я пользовался gperf, в gcc им тоже к стати пользуются).

    Ну и также помнить что trailing context в правилах лексического анализатора увеличивает время стадии лексического анализа (по крайней мере для Flex это справедливо - исхожу из того что PLY - аналог)

  5. August 20th, 2007 at 08:17 | #5

    По какой -то причине мой предыдущий комментарий не засабмитился. Вкратце: лексический анализатор можно оптимизировать убрав различные trailing context в правилах и используя хеш-функции для распознавания ключевых слов языка например.

  6. August 20th, 2007 at 11:17 | #6

     

    т.е. распознавать все ключевые слова при помощи одного правила, а тип лексемы определять при помощи хэш-функции

    Примерно так и делается, только вместо хеш функции используется поиск по словарю. Но это как мертвому припарки. Лексер в PLY - это одно длинное регулярное выражение. На этом фоне подобная оптимизация ничего не даёт. Ну а синтаксический разбор тормозит ещё больше.

    По какой -то причине мой предыдущий комментарий не засабмитился.

    Спам фильтр сработал почему-то.

  7. August 21st, 2007 at 00:30 | #7

    а без построения дерева обойтись никак нельзя? при помощи только одного лексического анализатора? Например написать несколько специализированных лексических анализаторов и каскадировать их работу?

  8. August 21st, 2007 at 08:06 | #8

     

    а без построения дерева обойтись никак нельзя? при помощи только одного лексического анализатора? Например написать несколько специализированных лексических анализаторов и каскадировать их работу?

    Наверняка можно извернуться, но в данном случае гораздо проще пересесть на более быструю лошадь: просто взять генератор парсера побыстрее.

  1. August 17th, 2007 at 11:24 | #1
  2. August 21st, 2007 at 16:19 | #2