Недавно я изучал синтаксический анализатор TypeScript, чтобы выяснить, как сделать парсер довольно рекурсивного спуска инкрементным.
Если вы посмотрите на реализацию инкрементного повторного анализа исходного файла в TypeScript: https://github.com/Microsoft/TypeScript/blob/master/src/compiler/parser.ts#L7213,, кажется, что он перезапускается с самого начала. Все утверждения пересматриваются. Кажется, что при инкрементном разборе: https://github.com/Microsoft/TypeScript/blob/master/src/compiler/parser.ts#L1714 позволяет искать существующие узлы в старом дереве для повторного использования.
Если я правильно читаю источник, инкрементальный разбор все равно анализирует весь файл. Он просто ищет узлы из старого дерева, вместо того, чтобы создавать новые, когда это возможно.
Мой вопрос: почему инкрементный парсер запускается с самого начала?
Разве не логичнее в инкрементальном контексте обходить парсетное дерево до тех пор, пока «испорченная» часть не перезапустится, и оттуда снова начать анализ? То есть Вы находите узел, оттуда инициализируете свой сканер и запускаете повторный анализ с помощью функции подходящего анализа?