首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >需要regex来完成语言解析器的基本递归特性(或帮助开发Babel插件)

需要regex来完成语言解析器的基本递归特性(或帮助开发Babel插件)
EN

Stack Overflow用户
提问于 2015-12-04 17:11:28
回答 1查看 131关注 0票数 1

我有以下命令:

代码语言:javascript
运行
AI代码解释
复制
/(?:this\.(\w+)\(([\s\S]*?)\))/g

它用于接受如下代码:

代码语言:javascript
运行
AI代码解释
复制
this.doSomething(foo, bar)

并将其替换为:

代码语言:javascript
运行
AI代码解释
复制
this.lookup('doSomething', [foo, bar])

对于该用例(最常见的用例),它正确工作,但如果在用例中使用this,则不能工作:

代码语言:javascript
运行
AI代码解释
复制
this.doSomething(foo, bar, this.baz())

其结果是错误的:

代码语言:javascript
运行
AI代码解释
复制
this.lookup('doSomething', [foo, bar, this.baz(]))

应该是这样:

代码语言:javascript
运行
AI代码解释
复制
this.lookup('doSomething', [foo, bar, this.baz()])

这是第一个问题。它实际上应该像this.doSomething一样被转换,所以最终的结果应该是:

代码语言:javascript
运行
AI代码解释
复制
this.lookup('doSomething', [foo, bar, this.lookup('baz', [])]);

基本上,我的regex假设来自this.baz()的结束括号是this.doSomething()的结束括号,并且也不递归地操作。这里我需要某种递归行为/控制。

我听说过xregexp,但我不知道它如何帮助我。它似乎也是真正的语言解析器可能是唯一的方法。我在那里经验不多,但我不怕弄脏我的手。像Esprima这样的工具能帮上忙吗?

最后,我希望在代码的构建步骤中做一些小的语言/语法更改,也就是完全像Babel那样。事实上我在利用巴贝尔。也许某种Babel插件是一种选择?

无论如何,我对quickfix技巧或更支持/健壮的语言解析技术都持开放态度。我也很好奇,这些问题通常是如何处理的。扫描整个输入和匹配的打开/关闭大括号/括号/等等,我想?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-05 11:32:53

下面是一个例子,说明如何使用Babel插件来完成这个任务:

代码语言:javascript
运行
AI代码解释
复制
var names = ['doSomething', 'baz'];

module.exports = function(context){
    var t = context.types;

    return {
        visitor: {
            CallExpression: function(path){
                var callee = path.get('callee');
                // Only process "this.*()" calls.
                if (!callee.isMemberExpression() ||
                    !callee.get('object').isThisExpression() ||
                    !callee.get('property').isIdentifier()) return;

                // Make sure the call is to one of your specific functions.
                if (names.indexOf(path.node.callee.property.name) === -1) return;

                // Build "this.lookup('<name>', [])".
                path.replaceWith(t.callExpression(
                    t.memberExpression(t.thisExpression(), t.identifier('lookup')),
                    [
                        t.stringLiteral(path.node.callee.property.name),
                        t.arrayExpression(path.node.arguments),
                    ]
                ));
            }
        }
    };
}

例如,如果将其放到plugin.js函数中,则可以创建一个.babelrc配置文件,并确保./plugin.js或指向它的任何路径都在plugins数组中。

.babelrc

代码语言:javascript
运行
AI代码解释
复制
{
  "presets": ['es2015'],
  "plugins": ['./plugin']
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34100079

复制
相关文章
从Tree Shaking来走进Babel插件开发者的世界
这里,我们就从Tree Shaking的角度出发来谈谈如何为我们自己的组件库提供按需加载方式。
19组清风
2021/11/15
7000
从Tree Shaking来走进Babel插件开发者的世界
【Babel】1145- 非常不错的 Babel 插件开发教程
如果你有babel相关知识基础建议直接跳过 前置知识 部分,直接前往 "插件编写" 部分。
pingan8787
2021/12/01
8570
【Babel】1145- 非常不错的 Babel 插件开发教程
Babel 插件开发&amp;访问节点
大家好,我是小鑫同学。一位从事过Android开发、混合开发,现在长期从事前端开发的编程爱好者,我觉得在编程之路上最重要的是知识的分享,所谓三人行必有我师。
前端小鑫同学
2022/12/26
5630
前端工程师为什么要学习编译原理?
普遍的观点认为,前端就是打好 HTML、CSS、JS 三大基础,深刻理解语义化标签,了解 N 种不同的布局方式,掌握语言的语法、特性、内置 API。再学习一些主流的前端框架,使用社区成熟的脚手架,即可快速搭建一个前端项目。胜任前端工作非常容易。再往深处学习,你会发现前端这个领域,总是有学不完的框架、工具、库,不断有新的轮子出现。技术推陈出新,版本快速迭代,但万变不离其宗。工具致力于流程自动化、规范化,服务于简洁、优雅、高效的编码,将问题高度抽象化、层次化。在如今前端开源界如此火热的现状下,框架的使用者与框架的维护者联系更加紧密,不仅能深入源码来更彻底地认识框架,还能够提出问题,参与讨论,贡献代码,共同解决技术问题,推进前端生态的发展和壮大。而编译原理,作为一门基础理论学科,除了 JS 语言本身的编译器之外,更成为 Babel、ESLint、Stylus、Flow、Pug、YAML、Vue、React、Marked 等开源前端框架的理论基石之一。了解编译原理能够对所接触的框架有更充分的认识。
Nealyang
2019/09/29
1.5K0
前端工程师为什么要学习编译原理?
babel的常用插件
1.@babel/plugin-proposal-class-properties
挥刀北上
2021/03/03
1.2K0
babel的常用插件
no-func-assign 分别用 Eslint 插件和 Babel 插件来实现
Eslint 有很多内置的 rule,其中有一个 rule 叫 no-func-assign,是指不能给函数赋值,目的是避免函数被重新赋值导致调用时出错。
神说要有光zxg
2021/11/25
2560
no-func-assign 分别用 Eslint 插件和 Babel 插件来实现
C语言例题,使用函数的递归完成
例题1: #include<stdio.h> int main(){ int fun(int n,int k); printf("%d",fun(5,5)); return 0; } int fun(int n,int k){ if(k==0) return 1; else return fun(n,k-1)*n; } 例题2:求 5! 使用递归函数完成 #include<stdio.h> int main(){ double fun(d
岳泽以
2022/10/26
6300
C语言例题,使用函数的递归完成
前端科普系列(5):ESLint - 守住优雅的护城河
【前端科普系列】帮助阅读者了解web前端,主要覆盖web前端的基础知识,但不深入讲解,定位为大而全并非细而精,适合非前端开发的同学对前端有一个系统的认识,能更好的与前端开发协作。尽可能的写成科普类文章,对于前端开发而言,只适合刚入门的新手。
2020labs小助手
2020/10/28
2.4K0
开发 Babel 插件可以试试这个 CLI 工具
大家好,我是小鑫同学。一位从事过Android开发、混合开发,现在长期从事前端开发的编程爱好者,我觉得在编程之路上最重要的是知识的分享,所谓三人行必有我师。
前端小鑫同学
2022/12/26
1.2K0
开发 Babel 插件可以试试这个 CLI 工具
Babel 6 特性总结
env : process.env.BABEL_ENV or process.env.NODE_env
逆葵
2019/04/25
4440
[第9期] 深入浅出 Babel 上篇:架构和原理 + 实战
这个文章系列将带大家深入浅出 Babel, 这个系列将分为上下两篇:上篇主要介绍 Babel 的架构和原理,顺便实践一下插件开发的;下篇会介绍 `babel-plugin-macros , 利用它来写属于 Javascript 的’宏‘。
皮小蛋
2020/03/03
1.2K0
[第9期] 深入浅出 Babel 上篇:架构和原理 + 实战
配置Babel高亮插件
我们可以按照官方文档进行配置:https://babeljs.io/docs/en/editors
阿超
2022/08/21
4130
配置Babel高亮插件
使用Maven插件来完成Mybatis逆向工程
Mybatis官方提供了逆向工程支持,只需简单操作,就可以根据数据库的表生成简单的实体类POJO和Mapper等文件。这里仅仅介绍使用Maven的插件来自动完成逆向工程操作。
itlemon
2020/04/03
1.2K0
深入浅出 Babel 上篇:架构和原理 + 实战
这个文章系列将带大家深入浅出 Babel, 这个系列将分为上下两篇:上篇主要介绍 Babel 的架构和原理,顺便实践一下插件开发的;下篇会介绍 babel-plugin-macros , 利用它来写属于 Javascript 的宏,
桃翁
2019/10/15
8300
深入浅出 Babel 上篇:架构和原理 + 实战
深入浅出 Babel 上篇:架构和原理 + 实战
这个文章系列将带大家深入浅出 Babel, 这个系列将分为上下两篇:上篇主要介绍 Babel 的架构和原理,顺便实践一下插件开发的;下篇会介绍 babel-plugin-macros , 利用它来写属于 Javascript 的宏,
Nealyang
2019/10/14
8740
深入浅出 Babel 上篇:架构和原理 + 实战
Babel配置傻傻看不懂?
前沿:文章起源在于,朋友跟树酱说在解决项目兼容IE11浏览器过程中,遇到“眼花缭乱”的babel配置和插件等,傻傻分不清配置间的区别、以及不了解如何引用babel插件才能让性能更佳,如果你也有这方面的疑虑,这篇文章可能适合你 1.babel babel是个什么玩意? Babel本质上是一个编辑器,也就是个“翻译官”的角色,比如树酱听不懂西班牙语,需要别人帮我翻译成为中文,我才晓得。那么Babel就是帮助浏览器翻译的,让web应用能够运行旧版本的浏览器中,比如IE11浏览器不支持Promise等ES6
树酱
2020/10/15
1.3K0
C++ 新特性学习(三) — Regex库
这个,显然是正则表达式库,作为一个强大而又NB的库,我表示对其理解甚少,只能先研究下基本用法,更具体的用法要等实际应用中用到的时候在细看了。 PS:正则表达式的资料见 http://www.regexlab.com/ 更多资料见 https://www.owent.net/2011/264.html
owent
2018/08/01
1.5K0
回顾 babel 6和7,来预测下 babel 8
babel 最开始叫 6to5,顾名思义,功能是 es6 转 es5。我们知道,es 版本一年一个,有了 es7(es2016)、es8(es2017)等之后,显然,6to5 的名字已经不合适了,所以 6to5 改名为了 babel。
公众号@魔术师卡颂
2021/05/08
8050
回顾 babel 6和7,来预测下 babel 8
Babel 的原理
完整高频题库仓库地址:https://github.com/hzfe/awesome-interview
HZFEStudio
2021/09/20
1K0
ScintillaNET 需要帮助
Scintilla是一个免费的源代码编辑控件,它完全开放源代码,并且提供一个license允许用户自由地将它用在开源软件或是商业软件中。作为源代码编辑控件,我们能在普通的的文本编辑控件中能看到的功能,Scintilla都完全能够实现,而且,它还能够提供很多编辑和调试源代码时有用的特殊功能。包括语法高亮显示,错误指示,代码自动完成以及代码提示等。而且在左边的空白处(margin),可以显示调试代码中非常有用的显示断点以及显示当前运行行等功能。而且,自定义风格的功能比其他大部分编辑器控件都开放,它允许用户自定
张善友
2018/01/22
1.5K0

相似问题

基本Regex需要帮助

15

需要Python Regex帮助(基本)

42

需要C语言的基本帮助

26

需要帮助来完成连接

10

需要帮助理解基本递归问题

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档