可以与Closure Compiler一起使用的JavaScript解析器生成器

时间:2011-08-04 01:25:04

标签: javascript parser-generator

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

但不清楚的是,这些与Google Closure Compiler这样的东西有多好。

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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