Привет. Подскажите пожалуйста на каком принципе делаются парсеры для современных языков программирования, что они пытаются продолжать парсинг даже когда встретили некорректные последовательности, и стараются охватить как можно больше ошибок за раз. Ну и литературу которую в эту сторону читать. Например, на данном скриншоте выведутся ошибки для let let let let, так и для невалидного.токена, хотя для простого парсера, парсинг должен был остановиться на этапе с let let let let, и вывелась ошибка бы только для этого, а невалидный.токен пропущен.