1

バッカス・ナウア記法の例を示すために小さな通訳を書いています。いくつかのデータを表すために助けを求めたいと思います。

<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

ご覧のとおり、すべてがステートメントにカプセル化されています。その後、割り当てと表現があります。式は、数値と変数をカプセル化する用語をカプセル化します。割り当ては、変数と式をカプセル化します。私の質問は、これらすべてを表すためにどのデータ構造を使用するかです。私はそれがセットであるべきだと思っています、しかしそれから私はネストされたセットを持っているべきかという疑問を提起しますか?

4

2 に答える 2

1

これは、いくつかのコマンド(PRINTおよびHALT)が追加された単純な式パーサーのように見えます。おそらく、そのようなものを解析する最も簡単な方法は、再帰下降パーサーを使用することです。インタープリターを作成している場合は、解析中に式を解釈するか、後で解釈するために式の接尾辞(または接頭辞)表現を作成できます。

于 2010-09-17T02:40:56.640 に答える
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、変数タイプとしてsを使用intし、数値タイプとしてsを使用することで解決できる可能性があります。

于 2010-09-17T02:08:28.487 に答える