解析器 (TCL) 中的换行符支持

Line break support in parser (TCL)

所以,我有一个用 TCL 编写的解析器。解析文件中有很多命令。现在,我需要添加对换行符的支持。 例如

my_command \
  arg1 \
  arg2 \
  arg3 

我有这样的东西。

while { ! [eof $currentFileDescriptor] } {
            set line [gets $currentFileDescriptor]
            set lst [lindex [regexp -all -inline {^(\s*(\S*)\s*)*(\{(.*)\})?(\s*(\S*)\s*)*$} $line] 0]
            set tok [string toupper [lindex $lst 0]]
            switch -glob $tok {
              "\#*" { }
              "MY_COMMAND_1" { parseMyCommand1 $handler $lst }
              .....#other commands  }
            }
            incr lnum
        }

我正在寻找最佳且有效的解决方案。

您似乎已经定义了一种域特定语言 (DSL),并在 Tcl 中实现了解析。您也可以使用 Tcl 解析本身来处理诸如行延续和引用处理之类的事情。这样做的方法是创建一个安全解释器,并在安全解释器中只提供您的 DSL 所需的命令。然后你在安全的子解释器中解释你的配置文件。 wiki page 有一些例子。

这种方法的优点是解析由普通的 Tcl 解析器处理。但是,您可以完全控制在安全解释器中公开哪些命令。您还可以控制它可以使用的资源量(堆栈和内存)并限制它对文件系统或网络的可见性。

如果你不想进入这个,那么你只需要实现对反斜杠换行符的识别并缓冲这些行,直到你有一个完整的行。类似于以下内容(未经测试):

set linenum 0
set buffer ""
while {[gets $input line] != -1} {
    incr linenum
    if {[regexp {\$} $line]} {
        append buffer [string range $line 0 end-1]
        continue
    } else {
        append buffer $line
    }
    ParseCompleteLine $linenum $buffer
    set buffer ""
}