2017-03-01 66 views
-1

我建立一个lex程序,将分析类似以下...正则表达式忽略多余的括号

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

是否有可能,特别是使用柔性,以创建一个正则表达式,这将挑选出在第一一切{}

,所以我会得到

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

,而不是

{ if a = b { print "Cool" } 

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

+1

似乎匹配大括号应该是'野牛'做的东西,但不是'flex' – tsh

回答

0

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

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

除此之外,我使用的在线正则表达式测试程序和Notepad ++与您的示例代码都匹配。您可以尝试RegEx {.*},它也符合所有要求。