Здравствуйте, vdimas, Вы писали:
V>"Умный Яндекс":
V>https://habrahabr.ru/company/yandex/blog/219311/
Комментарий автора записи
На очень сложны грамматиках скорость порядка 80 мб/час.
Извините. Мне нужно на 2-3 порядка быстрее.
V>А вот для парсера с откатами в случае недостаточности просмотра на 1, глубокая вложенность выражений может стать больным местом. Не зря расширения Пакрата и ALL используют мемоизацию и прочие трюки.
И этот человек утверждает, что что-то понимает.
У пакрата мемоизация не расширение, а его суть.
VD>>Но по другому нельзя, так как только обобщенный алгоритм может найти все пути.
V>Тогда тем более.
V>Блин, а чего вы мне голову морочите, если у вас вообще Эрли??? ))
Эрли только до неоднозначностей и для восстановления.
Те обычно он вообще не отсвечивает.
Да и когда запускается старается переключится на основной где может.
V>Уже надо были сидеть тише воды и не отсвечивать.
V>Небось взяли вот ту реализацию, которую разбирали когда-то на RSDN.
Не угадал. Реализация там своя.
Причем там не классический Эрли который понимает только BNF, а модернизированный который понимает EBNF (или точнее вообще любой автомат в правой части правила) без трансформации его в BNF. Плюс в отличии от классического Эрли не имеет проблем с nullable правилами. Классическому при наличии nullable правил приходиться итерироваться до фиксированной точки.
И это если забыть про мелочи типа оценки качества восстановления прямо во время разбора. Ибо способов восстановиться после ошибки много и нужно взять не какой попало, а лучший.
V>Кстате, я брал именно твой порт Эрли на .Net и с пол-тыка ускорил его втрое.
V>И всё-равно оно тормозит безбожно...
А зачем ты его взял. Чё GLR не написал? Он же круче.
V>Плохо ты читал.
V>Там где GLR восстановится за 10 секунд, там Эрли восстановится за 10 минут.
Так ты покажи мне ГЛР парсер который восстанавливается также хорошо, как парсер нитры.
Код на C#:
usingA
namespaceA
{
interfaceITest1
}
}
publicpartialclasskM2<T>
whereT new, ITest1
}
Восстановление:
внутри «» вставленные правила:
using A«;»
namespace A
{
interface ITest1
«{»
}
}
public partial class kM2<T>
where T«:» new«(»«)», ITest1
«{»
}
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>