1) 编写一个分词器,即解析字符流并将其转换为标识符列表、OpeningBrace、ClosingBrace、EqualSign 和 SemiColon 的函数;注释和空格被丢弃。可以使用 Regexpr 来完成。
2)编写一个简单的解析器。跳过第一个标识符和 OpeningBrace。
解析器需要一个标识符,后跟 EqualSign 或 OpeningBrace 或 ClosingBrace 之一。
2.1) 如果是等号,后面必须跟标识符和分号。2.2) 如果是OpeningBrace,递归调用解析器。2.3)如果ClosingBrace,从递归调用返回。
在2.1的处理中,将想要的数据输入到dict中,按照自己喜欢的方式。您可以在标识符前面加上封闭块的名称,例如
{"Main.SubSection.VariableName1": VariableValue1}
这是解析器的原型代码,在标记器之后调用。它扫描一个字符串,其中一个字母代表一个标识符,分隔符是={}; 最后一个标记必须是$。
def Parse(String, Prefix= "", Nest= 0):
global Cursor
if Nest == 0:
Cursor= 0
# Scan the input string
while String[Cursor + 0].isalpha():
# Identifier, starts an Assignment or a Block (Id |)
if String[Cursor + 1] == "=":
# Assignment, lookup (Id= | Id;)
if String[Cursor + 2].isalpha():
if String[Cursor + 3] == ";":
# Accept the assignment (Id=Id; |)
print Nest * " " + Prefix + String[Cursor] + "=" + String[Cursor + 2] + ";"
Cursor+= 4
elif String[Cursor + 1] == "{":
# Block, lookup (Id{ | )
print Nest * " " + String[Cursor] + "{"
Cursor+= 2
# Recurse
Parse(String, Prefix + String[Cursor - 2] + "::", Nest + 4)
else:
# Unexpected token
break
if String[Cursor + 0] == "}":
# Block complete, (Id{...} |)
print (Nest - 4) * " " + "}"
Cursor+= 1
return
if Nest == 0 and String[Cursor + 0] == "$":
# Done
return
print "Syntax error at", String[Cursor:], ":("
Parse("C{D=E;X{Y=Z;}F=G;}H=I;A=B;$")
执行时,它输出:
C{
C::D=E;
X{
C::X::Y=Z;
}
C::F=G;
}
H=I;
A=B;
证明它确实检测到了嵌套。用您喜欢的任何处理替换打印语句。