编写解释器,需要帮助来表示这些数据

时间:2010-09-17 01:53:18

标签: java data-structures bnf

我正在写一个小翻译来展示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

正如您所看到的,所有内容都封装在一个声明中。然后有分配和表达。表达式封装了一个术语,它封装了一个数字和一个变量。赋值封装了变量和表达式。我的问题是我用什么数据结构代表所有这些?我认为它应该是一个集合,但那么如果我有嵌套集会引发问题吗?

2 个答案:

答案 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}}作为您的号码类型。