Re[12]: Опциональные типы
От: WolfHound  
Дата: 09.03.17 09:20
Оценка:
Здравствуйте, 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>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.