Здравствуйте, WolfHound, Вы писали:
WH>Извините. Мне нужно на 2-3 порядка быстрее.
У тебя грамматики на 2-3 порядка проще.
Там же рядом коммент:
Замеры делали в самом начале разработки. 5.тыс «рыбных» комментариев(1 комментарий ~ 400 символов) с 20 простыми цепочками обработались за ~10сек
"В самом начале" я тоже для Эрли замеры делал, когда выбирал технологию обобщенного парсинга.
Это был кошмар.
V>>А вот для парсера с откатами в случае недостаточности просмотра на 1, глубокая вложенность выражений может стать больным местом. Не зря расширения Пакрата и ALL используют мемоизацию и прочие трюки.
WH>И этот человек утверждает, что что-то понимает.
WH>У пакрата мемоизация не расширение, а его суть.
У алгоритма Пакрата есть расширения (для левой рекурсии).
Ну и в этом же сообщении, прямо на которое ты отвечаешь, написано:
Пакрат — это крайний случай мемоизации.
Тщательнее надо демагогию разводить.
V>>Блин, а чего вы мне голову морочите, если у вас вообще Эрли??? ))
WH>Эрли только до неоднозначностей и для восстановления.
Т.е. для нормального процесса набития текста, где 90% времени текст невалиден?
WH>И это если забыть про мелочи типа оценки качества восстановления прямо во время разбора. Ибо способов восстановиться после ошибки много и нужно взять не какой попало, а лучший.
Чтобы взять лучший, надо иметь выбор. У тебя выбора не было.
V>>Кстате, я брал именно твой порт Эрли на .Net и с пол-тыка ускорил его втрое.
V>>И всё-равно оно тормозит безбожно...
WH>А зачем ты его взял.
Сравнить, ес-но.
Мне нужен был выбор.
WH>Чё GLR не написал? Он же круче.
Написал, выбрал.
WH>Так ты покажи мне ГЛР парсер который восстанавливается также хорошо, как парсер нитры.
У тебя прямо в таблице LR-разбора ДКА/НКА содержатся допустимые нетерминалы.
Например, нетерминал скобки.
State {
Trans transitions_;
...
};
State currentState = ...;
Trans::Symbol sym = currentState.transitions_.first().key();
Для нетерминалов-фиксированных цепочек терминалов можно брать прямо их содержимое.
Можно брать не обязательно 1-й элемент, а несколько первых для формирования подсказки об ошибке.
Сами правила в исходнике разместить по желаемому порядку и строить ДКА/НКА с сохранением порядка правил в переходах.
Я прямо так и выдавал ошибку: "конец потока, хотя ожидается сегмент такой-то",
или "неожиданный сегмент такой-то в позиции такой-то, ожидаемые сегменты: =список 1..3 элемента=".