interface ImportDeclaration extends Statement {
kind: SyntaxKind.ImportDeclaration;
importClause?: ImportClause;
moduleSpecifier: Expression;
}
我找不到moduleSpecifier
不是StringLiteral
答案 0 :(得分:1)
它必须是编译器的其余部分,但更一般地指定为Expression
类型,以便解析器可以正常地恢复并将其存储在其树中。
查看this comment from the source。
// We allow arbitrary expressions here, even though the grammar only allows string // literals. We check to ensure that it is only a string literal later in the grammar // check pass.
文件中的所有文本都必须属于其对应树中的某个节点。在上述情况下,我们希望在名为Identifier
的{{1}}上报告错误。
由于我们在解析后报告语法错误,因此无论表达式是什么,都需要在wat
上。否则,我们怎么知道应该的节点是什么?由importSpecifier
拥有的上下文允许我们在解析之后知道我们需要报告解析错误。
正如您所提到的,这需要付出代价 - ImportDeclaration
的所有用户都必须处理importSpecifier
是表达式的更一般情况。这绝对是痛苦的,遗憾的是,我没有为你提供很好的解决方法。