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

Javascript 如何在分析ES6标记模板中的内容时报告错误?,javascript,parsing,ecmascript-6,tagged-templates,Javascript,Parsing,Ecmascript 6,Tagged Templates,我正在和一个朋友一起做一个小的Javascript实验,它涉及一个基本的HTML解析器,实现为一个简单的状态机——你可以 我的问题是关于涉及任何类型解析器的标记模板函数,关于错误报告——也就是说,如果解析器检测到无效状态,它需要报告在输入中发现错误的位置 我的问题是以合理的方式跟踪和/或解释错误的发现位置 标记模板函数的输入实际上是源代码位(在我的例子中是HTML)与Javascript值的交替,因此您不能简单地(就像我现在所做的,就像您在大多数普通解析器中所做的)计数字符并报告位置,因为交替的

我正在和一个朋友一起做一个小的Javascript实验,它涉及一个基本的HTML解析器,实现为一个简单的状态机——你可以

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

我的问题是以合理的方式跟踪和/或解释错误的发现位置

标记模板函数的输入实际上是源代码位(在我的例子中是HTML)与Javascript值的交替,因此您不能简单地(就像我现在所做的,就像您在大多数普通解析器中所做的)计数字符并报告位置,因为交替的Javascript值可能不是字符串,或者可能是未被解析为文本源的字符串

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


或者我怀疑这种运行时工具实际上是不可能的,这是对的吗?除了可能提前使用Javascript解析器来发现和记录源位置之外,真的没有任何有用的方法来实现这一点吗?

这里所能做的就是输出发生问题的预期上下文。考虑到问题是由三个引起的:

const three = null;
`one${two}${three}four`
标记函数参数可以在错误消息中连接到它们开始有意义的位置,例如

Expected a number as an expression at position 2, got `null`,
`one${...}${...}four`
            ^^^
如果需要,还可以使用
new Error()检索堆栈跟踪。堆栈

如果需要更高的精度,则应使用模板引擎而不是模板文本,因为在模板编译期间,所有必要的数据都可用


标记功能的选项与任何其他功能的选项相同。如果
foo
函数是用
bar
变量作为等于
1
的参数调用的(比如
foo(bar)
),可能无法确定它是用
bar
foo
内部调用的,因为我们得到的只是
1
值。它被称为foo(bar)
的事实只有在我们有堆栈跟踪和对源文件的访问权限时才能被发现,而这在正常情况下是不存在的。此方法可用于应在上下文中提供反馈的情况,例如测试运行程序,因为它负责脚本加载并可以访问源文件。

我喜欢在有问题的站点附近打印出部分内容,并直观地指向错误,而不是字符/行号。比我能想到的任何东西都好——而且比引入编译器要简单得多!谢谢:-)