Как сообщить об ошибках при разборе содержимого в шаблонах с тегами ES6?

Я работаю с другом над небольшим экспериментом по Javascript, который включает в себя базовый анализатор HTML, реализованный как простой конечный автомат - вы можете увидеть код здесь.

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

Моя проблема заключается в отслеживании и / или объяснении того, где была обнаружена ошибка, таким образом, чтобы это имело смысл.

Входные данные для тегированной функции шаблона на самом деле представляют собой биты исходного кода (в моем случае HTML), чередующиеся со значениями Javascript, поэтому вы не можете просто (как я делаю сейчас, как вы это делаете в большинстве обычных синтаксических анализаторов) считать символы и отчет положение, поскольку чередующиеся значения Javascript не могут быть строками или могут быть строками, которые не анализируются в качестве литерального источника.

Есть ли какой-нибудь способ для тегированных функций шаблона обнаружить расположение исходных файлов чередующихся входных строк / значений?

Или я прав, подозревая, что подобный объект во время выполнения практически невозможен? Нет ли буквально никакого полезного способа реализовать это, кроме использования анализатора Javascript, возможно, заблаговременно, для обнаружения и регистрации местоположений источника?

1 ответ

Все, что можно сделать здесь, это вывести ожидаемый контекст, в котором возникла проблема. Учитывая, что проблема была вызвана three:

const three = null;
`one${two}${three}four`

Аргументы функции тега могут быть объединены в сообщении об ошибке до точки, где они начинают иметь смысл, например

Expected a number as an expression at position 2, got `null`,
`one${...}${...}four`
            ^^^

Трассировка стека также может быть получена при необходимости с new Error().stack,

Если требуется большая точность, вместо литералов шаблона следует использовать механизм шаблонов, поскольку все необходимые данные доступны во время компиляции шаблона.

Параметры для функции тега такие же, как и для любой другой функции. Если foo функция была вызвана с bar переменная как аргумент, равный 1 (лайк foo(bar)), может быть невозможно выяснить, что он был вызван с bar изнутри fooпотому что все, что у нас есть, это 1 значение. То, что это называлось как foo(bar) можно узнать только при наличии трассировки стека и доступа к исходному файлу, чего у нас нет при нормальных обстоятельствах. Этот метод может быть использован в тех случаях, когда необходимо предоставить обратную связь по контексту, например, при запуске теста - потому что он отвечает за загрузку скрипта и имеет доступ к исходным файлам.

Другие вопросы по тегам