我正在写一个小的解释器来显示一个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正如您所看到的,所有内容都封装在一条语句中。然后是一个赋值和表达式。表达式封装了一个术语,而术语又封装了一个数字和一个变量。赋值封装了一个变量和一个表达式。我的问题是,我应该使用什么数据结构来表示所有这些内容?我认为它应该是一个集合,但这就提出了一个问题,我应该有嵌套的集合吗?
发布于 2010-09-17 10:40:57
这看起来像是一个简单的表达式解析器,其中添加了一些命令(打印和停止)。解析这样的东西最简单的方法可能是使用recursive descent parser。如果您正在构建解释器,则可以在解析时解释表达式,或者构建表达式的后缀(或前缀)表示以供稍后解释。
发布于 2010-09-17 10:08:28
我将使用面向对象的方法:
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;
}诸若此类。根据需要与变量关联的信息量(可能是声明变量的位置、出现的行和列,等等),您可以使用Strings作为变量类型,使用ints作为number类型。
https://stackoverflow.com/questions/3732176
复制相似问题