0

我正在和一个朋友一起做一个小型的 Javascript 实验,它涉及一个基本的 HTML 解析器,实现为一个简单的状态机 - 你可以在这里看到代码

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

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

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

标记模板函数有什么方法可以发现交替输入字符串/值的源文件位置?

还是我怀疑这种运行时设施几乎是不可能的?除了使用 Javascript 解析器(可能提前)来发现和记录源位置之外,实际上是否没有任何有用的方法来实现这一点?

4

1 回答 1

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)对源文件的访问权限时才能发现它被调用的事实——在正常情况下我们没有。此方法可用于应在上下文中提供反馈的情况,例如测试运行器 - 因为它负责脚本加载并有权访问源文件。

于 2017-10-02T09:19:56.560 回答