- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在研究编译器构造,当然我也在研究这些概念在现实世界中的实现。一个例子是 Babel 的解析器:Babylon。
我查看了 Babylon 的代码,它似乎使用了带有嵌入式特殊语义规则的自上而下解析器。 src
我原以为 Babel 会使用 LR 解析器的一个成员,并且可能是一个定义文件,其中语法产生式与语义规则耦合在一起。为什么?好吧,主要是因为许多其他现实世界的语言使用 lr 解析器生成器,例如 Yacc、Bison 等,它们为您提供了这个确切的接口(interface),并且似乎是表示这些规则的更清晰和更易于维护的方式,甚至当您考虑到 Babel 处于 Javascript 标准的边缘,一直在实现新事物。
我还构建了自上而下和自下而上 (lr) 解析器,我没有发现两者之间存在很大的实现难度差异(两者同样困难 :))
那么,为什么 Babel 的解析器使用自上而下的特殊语法定向翻译,而不是我认为更结构化的方法?这背后的设计决策是什么?我错过了什么?
谢谢!
最佳答案
我觉得你真的在问两个(或三个)问题,所以我会分别解决它们
对于手写的解析器,情况实际上非常清楚:自上而下的解析器更容易编写和维护,以至于我从未见过手写的自下而上的解析器。
对于解析器生成器,情况不太清楚。存在两种类型的解析器生成器(例如,yacc 和 bison 是自下而上的,而 ANTLR 和 JavaCC 是自上而下的)。两者各有优缺点,我认为没有理由说一种方法明显优于另一种方法。
事实上,我认为在自上而下和自下而上的解析之间做出选择通常是没有意义的。手写解析器时,请始终使用前者。使用解析器生成器时,您应该简单地选择其功能最适合您的项目的工具,而不是根据它生成的是自下而上还是自上而下的解析器。
人们手写解析器的原因有很多。这些还取决于哪些解析器生成器甚至可用于该语言。解析器生成器经常遇到的一个缺点是它们很难为语法错误生成良好的错误消息。
另一个可能的问题是,对于非上下文无关语言,您可能需要一些肮脏的黑客来使用解析器生成器来实现它们,或者它可能根本不可能。
JavaScript 语法相当复杂,有很多特殊情况来解决歧义。在使用解析器生成器时可能需要大量的 hack,而对于可用于 JavaScript 的解析器生成器可能根本不可能。
我还要说的是,可用于 JavaScript 的解析器生成器可能还没有准备好生产,而且在项目刚创建时就更不用说了。
正如我所说,我从未见过手写的自下而上的解析器。因此,一旦您决定使用手写解析器,编写自顶向下解析器的决定就很容易了。
关于javascript - 为什么 Babel 使用自上而下的解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46780413/
我正在为我的 React 项目设置 Webpack,并对 babel 感到困惑, babel-core , babel-loader , babel-preset-2015和babel-preset-
所有这些 babel 依赖项是什么?它们各自的用途是什么,它们有何不同?我应该为我的 nodejs 网络应用程序使用哪一个? 我已经查看了 API 网站,但是否有任何指南可以将这些内容转化为简单的人类
我的 Node Webpack 项目使用了三个 babel 库。它们之间有什么区别以及如何使用它们? "dependencies": { "babel-runtime": "^5.8.24" }
我用 @babel/core 替换了 babel-core 而 babel-loader 期望 babel-core: { "name": "myproject-ui", "version":
我尝试配置一个环境来使用 babel 和 webpack 开发 javascript。 但是我不明白关于presets的babel配置. 在 Usage Guide ,我们可以看到预设为 "@babe
我已经安装了 babel 7.5,理想情况下它应该以 preset-env 包为目标,但不确定它为什么要寻找“babel-preset-es2015”。 你们能告诉我我做错了什么吗?下面是我的代码 p
我正在更新a boilerplate中使用的babel包,从 babel-core、babel-register 等到@babel/core、@babel/register > 等 问题:在 npm
设置 通天塔 6 (^6.0.0), Node 5.4.0,Express 4.13.x, babel-node 和 babel-register 都有警告,禁止在生产环境中使用babel.io 网站
我正在尝试转换编译我的 react/es6 代码并且来自 browserify。由于新的 babel 6 版本以及大多数教程现在已经过时的事实,我正在努力创建一个 webpack 构建。这适用于我的
我有一个使用 Typescript 和 @babel/preset-env 的项目。与 Webpack 捆绑失败并显示此错误和以下配置。 如果我取消注释该行,这会强制 @babel/plugin-pr
我在浏览器中使用 babel -> babel-standalone 现在我想使用 ES decorator 语法。但是所有的通天塔doc intro 是服务器端的 babel,比如 ` { "p
我正在编写对从 cdnjs.com 引入的所有这些库的 react 。但是,我发现它报告错误:'Uncaught TypeError: Cannot read property 'keys' of u
我正在使用 babel v7.6.x 并设置了以下内容。 包.json "scripts": { "dev": "nodemon --exec babel-node bin/index.js
我正在学习巨大的 JavaScript 生态系统,但我无法理解以下内容。 Babel 是一个编译器,来自官网: Babel is a toolchain that is mainly used to
在我使用yarn add -D babel-plugin-react-relay安装relay-query插件后,并在运行开发服务器后,我收到此错误: Error: [BABEL] /Users/ne
我使用 babel 6 和 React 插件,并按照文档说明设置转译过程。我已经阅读过要让 React 工作,我需要使用 es2015 和 React preset。最初,使用这两个预设一切都运行良好
我对 Babel 选项/配置有点迷失。我想使用最新的 js 功能并编译(使用 webpack)为浏览器代码。 babel-polyfill 和有什么区别和 babel plugins与 babel-p
这个问题在这里已经有了答案: Babel file is copied without being transformed (10 个答案) 关闭 6 年前。 我只是使用 npm (npm inst
安装时 npm install browserify babelify babel-preset-es2015 我正面临以下警告信息 npm WARN deprecated babel-preset-
什么版本的标准? 12.0.1 什么操作系统、Node.js 和 npm 版本? 视窗 10, 节点 v10.15.1, NPM v.6.8.0 你期望会发生什么? 我在 devDependencie
我是一名优秀的程序员,十分优秀!