正则表达式忽略多余的括号

Regex ignore redundant braces

我正在构建一个 lex 程序,它将分析如下内容...

function myFunc {
    if a = b {
        print "Cool"
    }
}

是否有可能,特别是使用 flex,来创建一个正则表达式来挑出第一个 { }

中的所有内容

所以我会得到

{ if a = b { print "Cool" } }

而不是

{ if a = b { print "Cool" }

目前在我的 flex 文件中我有这个正则表达式 {[^\0]*}

你尝试做的事情的一个问题是 RegEx 默认是贪婪的(可以做一些技巧来改变它,但你仍然会遇到问题),如果你 运行 在一个包含多个函数的文件中。原因是大部分编程语言都是Type 1 grammars乔姆斯基层次结构,或者上下文相关文法,而RegEx是Type 2(context-free)文法。如果不进行大量工作,根本不可能直接使用后者解析前者。对此的完整解释是……很长。但它归结为在上下文相关语法中,给定元素的含义可能会根据您在输入中的位置而改变,而在上下文无关语法中,每个元素都只有一个含义。在你的情况下,你不想匹配任何ole'},你想匹配相应的}到一个开放的{,这涉及到计算[=12=的数量] 和 } 你到目前为止已经看到了。

如果你真的想做代码解析而不需要重新发明轮子,犁,火,钢,一直到电,我建议你去看看AnTLR over on GitHub. AnTLR will allow you to create a grammar (if one does not already exist) for the language you are trying to parse and provide the parsed source code to you in the form of a Parse Tree. Parse trees are very, very easy to use and AnTLR has grammars already for almost every language imaginable, and plugins for several languages .

除此之外,我使用的在线正则表达式测试器和带有您的示例代码的 Notepad++ 都匹配。您可以尝试 RegEx {.*},它也匹配所有内容。