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插件,但直到现在我才找到正确的开始位置。