<p>我有一些类似的东西,但是是用java写的。它解析具有相同基本结构的文件,但语法略有不同(没有'{'和'}',只是像python中那样的缩进)。它是一种非常简单的脚本语言。在</p>
<p>基本上它是这样工作的:它使用堆栈来跟踪最内部的指令块(或者在您的案例中是数据),并将每个新的指令追加到顶部的块中。如果它分析了一条需要新块的指令,它将被推送到堆栈中。如果一个块结束,它将从堆栈中弹出一个元素。在</p>
<p>我不想发布整个来源,因为它是大的,它可以在谷歌代码(利扎德娱乐,修订版405)。有几件事你需要知道。在</p>
<ul>
<li>Instruction是一个抽象类,它有一个block-expected方法来指示具体指令是否需要块(如循环等),在您的情况下,这是不必要的,您只需要检查'{'。在</li>
<li>块扩展指令。它包含一个指令列表,并有一个add方法来添加更多的指令。在</li>
<li>indent_level返回指令文本前面的空格数。这对于{}sings也是不必要的。在</li>
</ul>
<p>占位符</p>
<pre><code>BufferedReader input = null;
try {
input = new BufferedReader(new FileReader(inputFileName));
// Stack of instruction blocks
Stack<Block> stack = new Stack<Block>();
// Push the root block
stack.push(this.topLevelBlock);
String line = null;
Instruction prev = new Noop();
while ((line = input.readLine()) != null) {
// Difference between the indentation of the previous and this line
// You do not need this you will be using {} to specify block boundaries
int level = indent_level(line) - stack.size();
// Parse the line (returns an instruction object)
Instruction inst = Instruction.parse(line.trim().split(" +"));
// If the previous instruction expects a block (for example repeat)
if (prev.block_expected()) {
if (level != 1) {
// TODO handle error
continue;
}
// Push the previous instruction and add the current instruction
stack.push((Block)(prev));
stack.peek().add(inst);
} else {
if (level > 0) {
// TODO handle error
continue;
} else if (level < 0) {
// Pop the stack at the end of blocks
for (int i = 0; i < -level; ++i)
stack.pop();
}
stack.peek().add(inst);
}
prev = inst;
}
} finally {
if (input != null)
input.close();
}
</code></pre>