我有一个文件,我必须在其中搜索“if statement”和相应的“end if statement”。目前我正在使用lsearch(分别为“if”和“end if”,然后使用lappend将两者结合起来)。当存在级联if语句时出现问题,这使得难以识别相关的“if”和“end if”对。如果两个语句之间没有赋值,那么我使用lreplace删除if和end if对之间的行。这必须在循环中运行,因为有多个这样的对。每次使用lreplace时,都会再次使用lsearch来计算新索引。我发现这是非常低效的实现。任何人都可以建议一些改进相同的指示。
答案 0 :(得分:1)
这不是一件简单的事情。问题是你真的需要一个pushdown automaton而不是一个简单的finite automaton。简单的搜索不会削减它。
您可以做的是:通过并将每个if
和end 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]
}