Frink 工具无法解析有效的 regsub 语法

Frink tool fails parsing valid regsub syntax

我正在使用 frink 2.2.2p4 清理遗留 TCL 代码,并提供静态检查。

它在有效的 TCL 语法上失败:

set foo [regsub {regex} $var {sub}]

错误信息是:

Missing "variable" part in call of regsub

我可以通过将代码更改为来绕过此错误:

set foo [regsub {regex} $var {sub} junk]

但是,这破坏了我的代码(foo 不再正确设置)

这是 frink 的已知问题吗?

这是 frink 的问题。 regsub 语法在替换后带有另一个词(这是一个变量名,用于写入替换字符串)是 Tcl 过去总是做 regsub 的方式,但几年前就改变了(我提交了更改在 2002 according to the logs of the change request) 时,很明显大多数人并不真正关心大多数时间执行了多少次替换。 frink 似乎从未更新过。

如果你无论如何都要使用 frink(而不是使用维护的 nagelfar,尽管它做了一些不同的事情)那么你应该写 regsub 调用这个:

# Old fashioned syntax
regsub {regex} $var {sub} foo

而不是:

# Tcl 8.4 or later syntax
set foo [regsub {regex} $var {sub}]

请注意,老式语法不会消失!仍然有一些情况下替换的计数是有用的(例如当剥离嵌套括号时,计数作为 while 循环的条件是好的)。

我找到了使用 vi/sed 的解决方法。
替换将 "junk" 变量添加到每个 regsub:

:%s/\(\[regsub.*["}].*\)\]/ junkk/g
:%s/\(\[regsub.*$\S\+\)\]/ junkk/g

如果最后一个字段是 "var" 或 {var}
,则应用第一次替换 如果最后一个字段是 $var

则应用第二次替换

保存文件并运行 frink。

~/bin/frink -enNU -w 250 script.tn > script_clean.tn

之后,将相同的替换还原为 script_clean.tn:

:%s/ junkk//g

这对我来说效果很好。
同样的技术也解决了我遇到的类似问题:

Error : Missing "variable name" part in call of upvar