0

我有一个文件,我必须在其中搜索 "if statement" 和相应的 "end if statement" 。目前我正在使用 lsearch(分别用于“if”和“end if”,然后使用 lappend 将两者结合起来)。当存在级联 if 语句时会出现问题,这使得难以识别相关的“if”和“end if”对。如果两个语句之间没有赋值,那么我使用 lreplace 删除 if 和 end if 对之间的行。这必须循环运行,因为有多个这样的对。每次使用 lreplace 时,都会再次使用 lsearch 来计算新的索引。我发现这是非常低效的实现。任何人都可以提出一些改进的建议。

4

1 回答 1

1

这不是一件简单的事情。问题是你真的需要一个下推自动机而不是一个简单的有限自动机。简单的搜索不会削减它。

但是您可以做的是:检查并用其他未使用的字符替换每个ifandend if关键字(\u0080并且\u0081是很好的候选者;C1 控件非常晦涩难懂)。然后,您可以在循环中使用简单的匹配来挑选每个内部对,同时要求内部没有不匹配的\u0080/ \u0081。每次匹配时,您都可以将字符交换回标记,并同时进行您想要的其他处理。一旦没有更多匹配项,您就完成了。

set txt [string map {"end if" "\u0081" "if" "\u0080"} $txt]
while {[regexp -indices {\u0080[^\u0080\u0081]*\u0081} $txt span]} {
    set bit [string map {"\u0081" "end if" "\u0080" "if"} [string range $txt {*}$span]]
    puts "matched $bit"
    # ...
    set txt [string replace $txt $bit {*}$span]
}
于 2013-09-24T14:19:22.200 回答