正则表达式忽略冗余括号

时间:2017-03-01 02:53:26

标签: regex flex-lexer

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

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

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

中挑出一切

所以我会得到

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

而不是

{ if a = b { print "Cool" }

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

1 个答案:

答案 0 :(得分:0)

你要做的一个问题是,默认情况下RegEx是贪婪的(可以做一些技巧来改变它,但你仍然会遇到问题),如果你运行这个,你会比预期更多在包含多个功能的文件中。原因是大多数编程语言在Chomsky层次结构中是Type 1 grammars,或者是上下文敏感的语法,而RegEx是类型2(无上下文)语法。基本上不可能在没有大量工作的情况下使用后者直接解析前者。对此的完整解释是......很长。但它归结为在上下文敏感的语法中,给定元素的含义可以根据您在输入中的位置而改变,而在无上下文语法中,每个元素只有一个含义。在你的情况下,你不想匹配任何ole' },您希望将相应的}与开放的{相匹配,其中包括计算到目前为止您所见过的{}的数量。 / p>

如果你真的想要进行代码解析而不必重新发明轮子,犁,火,钢,一直到电,我建议你去看看AnTLR结束GitHub上。 AnTLR将允许您为您尝试解析的语言创建语法(如果尚不存在),并以Parse Tree的形式向您提供已解析的源代码。解析树非常非常容易使用,AnTLR已经为几乎所有可以想象的语言提供了语法,plugins for several languages

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