我有一个项目,用户需要为完全用 javascript 编写的 ui 定义一组指令。我需要能够解析一串指令,然后将它们翻译成指令。是否有任何用于解析 100% javascript 的库?还是会在 javascript 中生成的生成器?谢谢!
10 回答
可能是http://jscc.phorward-software.com/之类的东西?
JS/CC 是第一个适用于JavaScript 和 ECMAScript衍生的解析器开发系统。它的开发既是为了构建一个高效的编译器开发系统,也是为了为那些对如何在自下而上的解析中进行解析表生成感兴趣的人创建一个易于使用的学术环境。
独立于平台的软件结合了:基于正则表达式的词法分析器生成器,匹配来自输入字符流的单个标记和一个LALR(1)解析器生成器,计算给定上下文无关文法规范的解析表并构建一个标准独自工作的解析器。提供给 JS/CC 的上下文无关文法是在基于Backus-Naur-Form的元语言中定义的,并允许插入单个语义代码以根据规则的简化进行评估。
JS/CC 本身完全用 ECMAScript 编写,因此可以以多种不同方式执行:作为嵌入在网站上的独立于平台、基于浏览器的 JavaScript、作为 Windows 脚本宿主应用程序、作为编译的 JScript.NET 可执行文件、作为Mozilla/Rhino 或 Mozilla/Spidermonkey 解释应用程序,或 Windows、*nix、Linux 和 Mac OSX 上的 V8 shell 脚本。但是,为了高效执行,建议使用命令行版本。这些版本能够从 JS/CC 解析器规范组装完整的编译器,然后将其存储到 .js JavaScript 源文件中。
如果您想构建 JavaScript 解析器和代码生成器,请查看 Javascript 中的 MetaII 实现。
MetaII 编译器教程将引导您构建一个完全独立的编译器系统,该系统可以翻译自身和其他语言:
这一切都基于 Val Schorre 的一篇惊人的 10 页小技术论文:META II: A Syntax-Oriented Compiler Writing Language fromHonest-to-God 1964。MetaII 编译器完整的自我描述大约有 30 行!早在 1970 年,我就学会了如何构建编译器。当你终于了解编译器如何自我再生时,这是一个令人兴奋的时刻。
本教程解释了 MetaII,它是如何工作的,并实现了 MetaII 将 MetaII 编译成 JavaScript。您可以轻松修改此编译器以解析其他语言,并生成不同的 Javascript。
我从大学时代就认识网站作者,但与网站无关。
Jison 可能是最好的和最活跃的 Javascript 词法分析器和解析器生成器。它模仿 Bison 和 Yacc。
吉森:http: //zaach.github.io/jison/
如果您只想要一个轻量级词法分析器(~100 sloc),您可以查看 Lexed.js: https ://github.com/tantaman/lexed.js
对于简单的解析任务,我非常喜欢使用 Pratt 的Top Down Operator Precedence parser的变体。虽然 Pratt 使用旧的 Lisp 方言编写了原始论文,但相同的概念可以很容易地用于大多数任何语言。事实上,Douglas Crockford 写了一篇关于JavaScript 中自顶向下运算符优先级解析的优秀文章,这可能正是你所需要的。
这是一个“伪”自然指令语言的解析器示例,它是用纯JavaScript 和Chevrotain Parsing DSL实现的:
https://github.com/SAP/chevrotain/blob/master/examples/parser/inheritance/inheritance.js
此示例甚至包括使用语法继承对多种自然语言(英语和德语)的支持。
Chevrotain 属于“用于解析 100% javascript 的库”类别, 因为它不执行代码生成。使用 Chevrotain 类似于“手工制作”递归体面的解析器,只是没有大部分令人头疼的问题,例如:
- 前瞻功能创建(决定采用哪个替代方案)
- 自动错误恢复。
- 左递归检测
- 歧义检测。
- 职位信息。
- ...
因为雪佛兰会自动处理。
根据“指令集”的设计,您也许可以使用 Javascript 的内置eval
函数,该函数解析 Javascript 源代码;您可以编写一个简单的翻译器将指令转换为 Javascript 代码。
顺便说一句,要非常小心 XSS 漏洞。
如果你想要一个词法分析器,而只是一个词法分析器,那么看看这个:https ://github.com/aaditmshah/lexer
它是一个纯 JavaScript 词法分析器,仅用几行代码编写了许多强大的功能。
Antlr 4.5 版现在有一个Javascript 目标。
如果您真的只是在寻找词法分析器,请尝试prettify。
我正在寻找类似的东西,不会有任何安全漏洞,我遇到了两个资源。他们不解析脚本,但实际上在“安全”环境中运行它 - 使用该eval
函数时您无法保证。所以,我不知道它是否正是你要找的东西,但看看:
- jsandbox - Javascript 沙箱
- Google Caja - 虚拟 iframe。