Regexp以确定源代码行是否在函数内



我有一个给定的多行源代码和一个{行索引}。我想知道,如果源代码行(让我们说第12行'$var3 = "bar")被Func/EndFunc包围,以及它在哪个函数中。在本例中,它位于"_MyFunction2"

$var1 = "Test"
Func _MyFunction()
$var2 = 1234
EndFunc
$var3 = "foo"
_MyFunction()
_MyFunction2()
Func _MyFunction2()
$var3 = "bar"
EndFunc
MsgBox(0,"",$var1)

我构建的模式看起来像这样- replace "12"加上相应的行号:

^(?m)(?:Func ([^(]+).+n|.*n){12}(?s)(?=(?:.(?<!Func))+EndFunc)

我的问题是有没有更优雅或更高效的方法?我觉得这个正则表达式很笨拙。

不幸的是,由于#cs#ce以及其他东西,这样的正则表达式可能太复杂了

我建议使用tidy.exe解析器工具。可以在SciTE的目录("full")需要安装)

用法:"tidy.exe" "yourScript.au3" /gen_doc

输出解析后的源代码,包括函数、行号和变量列表。您应该逐行解析输出:

  • 在变量列表中查找以'#### '
  • 开头的行
  • 为每个变量解析其名称和'Dim'行号,使用regexp
  • 现在在源代码列表部分
  • 中找到带有这个数字的行
  • 如果行不是以NNNNN |开头,那么变量是全局作用域
  • 否则,在函数列表中搜索行号大于变量行号的函数,这将是你的函数

最新更新