如何在解析ES6标记模板中的内容时报告错误?

时间:2017-10-02 07:47:43

标签: javascript parsing ecmascript-6 tagged-templates

我正在与一位朋友合作进行一项小型Javascript实验,该实验涉及一个基本的HTML解析器,实现为一个简单的状态机 - 您可以see the code here

我的问题是关于标记模板函数,涉及任何类型的解析器,关于错误报告 - 也就是说,如果解析器检测到无效状态,它需要报告在输入中找到错误的位置。

我的问题是以一种有意义的方式跟踪和/或解释发现错误的位置。

标记模板函数的输入实际上是源代码(在我的情况下是HTML)与Javascript值的交替,所以你不能简单地(正如我现在所做的那样,就像你在大多数情况下所做的那样)普通解析器)计算字符并报告位置,因为交替的Javascript值可能不是字符串,或者可能是不能被解析为字面值的字符串。

标记模板函数是否有办法发现交替输入字符串/值的源文件位置?

或者我是否正确怀疑这种运行时设施几乎是不可能的?实际上没有实用的方法,没有使用Javascript解析器,可能是提前发现和记录源位置吗?

1 个答案:

答案 0 :(得分: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)),则可能无法确定是否使用{{1}调用它来自bar内部,因为我们所拥有的只有foo值。只有当我们有堆栈跟踪访问源文件时才会发现它被称为1这一事实 - 这是我们在正常情况下所不具备的。该方法可用于应在上下文中提供反馈的情况,例如,测试运行器 - 因为它负责脚本加载并且可以访问源文件。