質問

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

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

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

名前を正確に nc 回繰り返す必要があることを文法で定義する方法

役に立ちましたか?

解決

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

の線に沿って何かが欲しい
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++;
      }
...

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top