【问题标题】:How to report errors while parsing content in ES6 tagged templates?解析 ES6 标记模板中的内容时如何报告错误?
【发布时间】:2017-10-02 07:47:42
【问题描述】:

我正在和朋友一起做一个小型 Javascript 实验,其中涉及一个基本的 HTML 解析器,实现为一个简单的状态机 - 你可以see the code here

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

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

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

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

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

【问题讨论】:

    标签: javascript parsing ecmascript-6 tagged-templates


    【解决方案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)),则可能无法确定它是从foo 内部用bar 调用的,因为所有我们得到的是1 值。它被称为 foo(bar) 的事实只有在我们有堆栈跟踪 对源文件的访问权限时才能发现 - 在正常情况下我们没有这些权限。此方法可用于应在上下文中提供反馈的情况,例如一个测试运行器 - 因为它负责脚本加载并可以访问源文件。

    【讨论】:

    • 我喜欢打印出违规站点附近的部分内容并直观地指出错误的想法,而不是字符/行号。比我能想到的任何东西都要好——而且比引入编译器要简单得多!谢谢:-)
    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 2017-08-02
    • 2018-02-23
    相关资源
    最近更新 更多