我正在构建一个lex程序,它将分析以下内容......
function myFunc {
if a = b {
print "Cool"
}
}
是否有可能,特别是使用flex,创建一个正则表达式,将在第一个{}
中挑出一切所以我会得到
{ if a = b { print "Cool" } }
而不是
{ if a = b { print "Cool" }
目前在我的flex文件中我有这个正则表达式 {[^ \ 0] *}
答案 0 :(得分:0)
你要做的一个问题是,默认情况下RegEx是贪婪的(可以做一些技巧来改变它,但你仍然会遇到问题),如果你运行这个,你会比预期更多在包含多个功能的文件中。原因是大多数编程语言在Chomsky层次结构中是Type 1 grammars,或者是上下文敏感的语法,而RegEx是类型2(无上下文)语法。基本上不可能在没有大量工作的情况下使用后者直接解析前者。对此的完整解释是......很长。但它归结为在上下文敏感的语法中,给定元素的含义可以根据您在输入中的位置而改变,而在无上下文语法中,每个元素只有一个含义。在你的情况下,你不想匹配任何ole' }
,您希望将相应的}
与开放的{
相匹配,其中包括计算到目前为止您所见过的{
和}
的数量。 / p>
如果你真的想要进行代码解析而不必重新发明轮子,犁,火,钢,一直到电,我建议你去看看AnTLR结束GitHub上。 AnTLR将允许您为您尝试解析的语言创建语法(如果尚不存在),并以Parse Tree的形式向您提供已解析的源代码。解析树非常非常容易使用,AnTLR已经为几乎所有可以想象的语言提供了语法,plugins for several languages。
除此之外,我使用的在线正则表达式测试器和带有示例代码的Notepad ++都匹配了所有内容。您可以尝试RegEx {.*}
,它也匹配所有内容。