Информация об изменениях

Сообщение Re[13]: Опциональные типы от 09.03.2017 12:47

Изменено 09.03.2017 12:47 vdimas

Re[13]: Опциональные типы
Здравствуйте, 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 элемента=".
Re[13]: Опциональные типы
Здравствуйте, 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 элемента=".