所以,我有一个用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
}
我正在寻找最佳和有效的解决方案。
答案 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 ""
}