用 Javascript 编写的词法分析器?

IT技术 javascript parsing generator lexer
2021-03-10 17:26:13

我有一个项目,其中用户需要为完全用 javascript 编写的 ui 定义一组指令。我需要能够解析一串指令,然后将它们翻译成指令。是否有任何用于解析 100% javascript 的库?或将在 javascript 中生成的生成器?谢谢!

6个回答

也许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 编译器教程将引导您构建一个完全独立的编译器系统,该系统可以翻译自身和其他语言:

MetaII 编译器教程

这一切都基于 Val Schorre 的一篇惊人的 10 页技术论文:META II: A Syntax-Oriented Compiler Writing Language from truth-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自上而下运算符优先级解析器的变体虽然普拉特使用旧的 Lisp 方言写了原始论文,但相同的概念可以很容易地用在大多数任何语言中。事实上,Douglas Crockford 写了一篇关于JavaScript 自上而下运算符优先级解析的优秀文章,这可能正是您所需要的。

解析器是否可以下载?我试图阅读 PDF,但它需要登录 :(
2021-04-28 17:26:13
对于那个很抱歉。我已经编辑了我的答案,用我找到的免费 PDF 链接替换了原始链接。就我个人而言,我实际上发现 Crockford 的文章比论文本身更有用,我主要是出于历史兴趣而将其包括在内。如果你说 Lisp,这里有一些基于论文的代码:bit.ly/dFdrl,这里也有基于 Python 的实现:bit.ly/12HNkV
2021-05-01 17:26:13

这是一个“伪”自然指令语言的解析器示例,它是在JavaScript 中使用Chevrotain Parsing DSL 实现的

https://github.com/SAP/chevrotain/blob/master/examples/parser/inheritance/inheritance.js

此示例甚至包括使用语法继承多种自然语言(英语和德语)的支持

Chevrotain 属于“用于解析 100% javascript 的库”的类别, 因为它不执行代码生成使用 Chevrotain 类似于“手工制作”一个递归体面的解析器,只是没有令人头疼的问题,例如:

  • 前瞻函数创建(决定采用哪种替代方案)
  • 自动错误恢复。
  • 左递归检测
  • 歧义检测。
  • 位置信息。
  • ...

因为雪佛兰会自动处理。