2

以下に示すようなファイルの文法を定義する必要があります。

//サンプルファイル
NameCount = 4
Name = a
Name = b
Name = c
Name = d
//ファイルの終わり

これで、 NameCountNameのトークンを定義できるようになりました。しかし、 NameCountの後の値であるトークンNameのインスタンスの有効な数を含むファイル構造を定義する必要があります。値を解析して整数に変換し、文法のグローバルスコープで変数に保存します(変数ncなど)。

Nameが正確にnc回繰り返されるように文法で定義する方法は?

4

2 に答える 2

6

これは文法自体では表現できません。数が修正された場合は、予想されるトークンの数を表すことができます。ただし、トークンストリームは値に基づいて変化します。あなたができることは、これをレクサー/パーサーの組み合わせに含めることです。ただし、単純な文法構文だけでこの構成を作成することはできません。あなたはおそらくの線に沿って何かが欲しい

grammar test;

@members {
  private int count = 0;
  private int names = 0;
}

file
    : count (name)+
      {
        if (count != names) throw new Exception("");
      }
    ;

count
    : 'NameCount' EQ Number
      {
        count = Integer.parseInt($Number.text);
      }
    ;

name
    : 'Name' EQ Value
      {
        names++;
      }
...
于 2008-12-02T22:21:06.787 に答える
1

これが文脈自由文法かどうかはわかりません。そうでない場合、言語を解析するように ANTLR に指示することはできません。

于 2008-11-21T14:31:45.583 に答える