首页 > 解决方案 > 使用 Ragel 从 ES6 模板文字中提取标记

问题描述

JavaScript 包含以下语法:

`hello ${name}`

我想知道 Ragel 机器如何拆分上面的语法。在我看来,右花括号的类型取决于解析状态。例如,在下面的代码中,大括号是字符串标记的一部分,因为${标记不存在:

`hello name}`

最后,当您考虑在变量表达式本身中也可以找到正确的卷曲时,它变得更加棘手,即:

`hello ${() => { return name }()}`

Ragel 如何实现类似的上下文相关语法?

标签: ragel

解决方案


`` 里面的语法通常不是你的词法分析器可以处理的。最好将它作为一系列文字文本和/或标记发送到您的解析器。因此,您将发送“`”作为开头,“hello”作为一些文字文本,然后是标记“(”,“)”等。要知道何时停止并返回文字文本,您需要来自解析器的一些反馈到您的扫描仪,或在您需要平衡括号的扫描仪内部。

注意我从来没有真正为javascript制作过解析器,只是按照你上面提供的内容进行。


推荐阅读