2

我一直在寻找 Javascript 的解析器生成器,并找到了一些(即 PEG.js)。

不过,尚不清楚这些与 Google Closure Compiler 之类的东西配合得如何。

例如,它看起来像在 PEG.js 中,我可以给它代码作为规则的一部分执行,但是我如何将函数(可能被编译器重命名)绑定到规则?

此外,我不清楚哪些解析器支持传入符号表。例如,我想定义一个接受像“A 或 B”这样的表达式的语法,其中“A”和“B”的值是在运行时定义的,例如,作为用户正在查看的记录的属性。

PEG.js 当然不是必需的,它只是似乎出现在搜索结果中并且看起来可用的唯一解析器生成器。

4

2 回答 2

1

这里列出了一些使用 Javascript 作为输出语言的解析器。对于实际上用 Javascript 构建并且无需在浏览器中预编译即可使用的解析器,似乎除了PEG.js之外还有JS/CC

还有其他方法,例如将语法发送到服务器上的解析器生成器。为此,将有使用 Nodejs 的Jison(该站点包含它的演示),并且可能上面列表中用其他语言编写的其他解析器也可以在您的服务器上运行。如果这些生成的文件与闭包编译器兼容,则可以在服务器上编译它们,然后将生成的解析器的位置发送回站点。也许解析器已经优化,编译器没有太多工作要做,应该首先检查。

服务器解决方案意味着符号不是在运行时真正定义的,而是语法是在运行时定义的,并且可以为该语法生成​​解析器。这是一个很大的区别,但可能正是你所需要的。如果您只需要一个用于检查标识符是否存在或是否具有正确(静态)类型的符号表,那么分析生成的解析树并在该点抛出错误可能就足够了。

于 2011-08-25T14:40:13.653 回答
0

我的 AGL 解析器构建器是用 Kotlin common 编写的,因此它可以用于任何 Kotlin 目标(JVM、JavaScript、本机代码等)。

const agl_module = require('net.akehurst.language-agl-processor');
const Agl = agl_module.net.akehurst.language.agl.processor.Agl;
const grammarStr = ...
const sentence = ...
const proc = Agl.processorFromString(grammarStr);
const asm = proc.process(sentence).toArray();

有关完整详细信息,请参阅:

https://medium.com/@dr.david.h.akehurst/a-kotlin-multi-platform-parser-usable-from-a-jvm-or-javascript-59e870832a79

于 2020-04-09T13:48:40.220 回答