Regex 需要正则表达式来完成语言解析器的基本递归功能(或帮助制作Babel插件)
我有以下正则表达式:Regex 需要正则表达式来完成语言解析器的基本递归功能(或帮助制作Babel插件),regex,abstract-syntax-tree,babeljs,xregexp,esprima,Regex,Abstract Syntax Tree,Babeljs,Xregexp,Esprima,我有以下正则表达式: /(?:this\.(\w+)\(([\s\S]*?)\))/g 它用于获取如下代码: this.doSomething(foo, bar) this.doSomething(foo, bar, this.baz()) 并将其替换为: this.lookup('doSomething', [foo, bar]) 对于该用例(这是最常见的),它可以正常工作,但如果在其中使用this,它就不能工作,如下所示: this.doSomething(foo, bar) th
/(?:this\.(\w+)\(([\s\S]*?)\))/g
它用于获取如下代码:
this.doSomething(foo, bar)
this.doSomething(foo, bar, this.baz())
并将其替换为:
this.lookup('doSomething', [foo, bar])
对于该用例(这是最常见的),它可以正常工作,但如果在其中使用this
,它就不能工作,如下所示:
this.doSomething(foo, bar)
this.doSomething(foo, bar, this.baz())
结果是:
this.lookup('doSomething', [foo, bar, this.baz(]))
应该是这样的:
this.lookup('doSomething', [foo, bar, this.baz()])
这是第一个问题。它实际上应该像这样进行转换。doSomething,因此最终结果应该是:
this.lookup('doSomething', [foo, bar, this.lookup('baz', [])]);
基本上,我的正则表达式假设this.baz()
的右括号是this.doSomething()
的右括号,并且也不递归操作。我需要某种递归行为/控制
我听说过xregexp,但我不确定这对我有什么帮助。看起来,真正的语言解析器可能是唯一的出路。我在那里没有多少经验,但我不怕弄脏我的手。像Esprima这样的工具似乎能帮上忙
在一天结束时,我希望在代码的构建步骤中做一些小的语言/语法更改,就像巴贝尔那样。事实上我用的是巴贝尔。也许某种巴别塔插件是一种选择
无论如何,我对quickfix正则表达式技巧或更专业/健壮的语言解析技术持开放态度。我也只是好奇这些问题通常是如何处理的。扫描整个输入并匹配开/闭括号/圆括号等,我假设???下面是一个使用Babel插件的示例:
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),
]
));
}
}
};
}
“看来真正的语言解析器可能是唯一的出路”是的,很有可能。对于递归的东西,语言解析比正则表达式更合适,正则表达式非常有限。我想你对从哪里开始没有任何建议?好吧,这个网站更多的是问答风格,而不是更广泛的建议。但是如果你有兴趣,可以研究一下lex&yacc和GNU版本flex&bison。关于GNU的工具也很不错,我从中学到了很多。词汇分析确实是一门庞大的学科,但如果你愿意深入研究,并且有抱负,那就去做吧。知识不会占用空间,它可能对您未来的项目和职业生涯非常有用。您是希望将此作为构建步骤的一部分,还是希望处理这些文件并将其写回磁盘。@faceyspacey.com:JS regex中没有递归或平衡组支持,因此,您应该修改一些现有的解决方案(和),或者编写自己的解析器。太棒了。。正是我想要的。不知道还能说什么。我一直在研究Babel插件,但直到现在我才找到正确的开始位置。