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

时间:2015-05-21 08:09:13

标签: parsing 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
        }

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

1 个答案:

答案 0 :(得分:5)

看起来您已经使用Tcl中实现的解析定义了域特定语言(DSL)。您也可以使用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 ""
}