我正在写一个小翻译来展示Backus-Naur形式的一个例子,我想请求帮助来代表一些数据。
<statement> : <assignment> | HALT | PRINT(<variable>)
<assignment> : <variable> = <expression>
<expression> : <term> | <term><operator><expression>
<term> : <number> | <variable>
<variable> : x | y | z
<operator> : + | -
<number> : 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
正如您所看到的,所有内容都封装在一个声明中。然后有分配和表达。表达式封装了一个术语,它封装了一个数字和一个变量。赋值封装了变量和表达式。我的问题是我用什么数据结构代表所有这些?我认为它应该是一个集合,但那么如果我有嵌套集会引发问题吗?
答案 0 :(得分:1)
这看起来像一个简单的表达式解析器,带有一些添加的命令(PRINT和HALT)。解析这种事情的最简单方法可能是使用recursive descent parser。如果您正在构建解释器,则可以在解析时解释表达式,或者构建表达式的后缀(或前缀)表示以供以后解释。
答案 1 :(得分:0)
我会使用OO方法:
public class State { /* ... */ }
public abstract class Statement {
// ...
public abstract void evaluate(State state);
// ...
}
public class AssignmentStatement extends Statement {
// ...
private Variable var;
private Expression expr;
// ...
}
public class HaltStatement extends Statement { /* ... */}
public class PrintStatement extends Statement {
private Variable var;
}
等等。根据您需要与变量关联的信息量(可能在声明它们的位置,此事件出现的行和列等等),您可能会使用String
作为变量类型并{ {1}}作为您的号码类型。