我正在构建一个 lex 程序,它将分析如下内容...
function myFunc {
if a = b {
print "Cool"
}
}
是否有可能,特别是使用 flex,创建一个正则表达式来挑出第一个 {} 中的所有内容
所以我会得到
{ if a = b { print "Cool" } }
代替
{ if a = b { print "Cool" }
目前在我的 flex 文件中,我有这个正则表达式 {[^\0]*}
您正在尝试做的一个问题是 RegEx 默认情况下是贪婪的(可以做一些技巧来改变它,但您仍然会遇到问题),如果您在具有多个文件的文件上运行它,您将匹配更多在其中发挥作用。原因是大多数编程语言是Chomsky 层次结构中的Type 1 文法,或者上下文相关文法,而 RegEx 是 Type 2(上下文无关)文法。基本上不可能在没有大量工作的情况下直接使用后者解析前者。对此的完整解释很长。但归结为在上下文敏感的语法中,给定元素的含义可以根据您在输入中的位置而改变,而在上下文无关的语法中,每个元素都只有一个含义。在您的情况下,您不想匹配任何 ole'}
,要匹配相应}
于一个开放的{
,这涉及到计算的数量{
和}
到目前为止你已经看到了。
如果您真的想进行代码解析而不必重新发明轮子、犁、火、钢,甚至电力,我建议您在 GitHub 上查看AnTLR。AnTLR 将允许您为您尝试解析的语言创建语法(如果尚不存在),并以Parse Tree的形式向您提供已解析的源代码。解析树非常非常易于使用,AnTLR 已经拥有几乎所有可以想象到的语言的语法,以及多种语言的插件。
除此之外,我使用的在线正则表达式测试器和带有示例代码的 Notepad++ 都匹配。您可以尝试{.*}
也匹配所有内容的 RegEx 。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句