質問

ユーザーが属性を持ついくつかのオブジェクトを定義できる簡単な文法があります。例えば:

carpark : my carpark
lots: 100

car: BMW
color: red
wheels: 4

motocycle
age: 4
color: red

carpark : my second carpark

car:...
...
car:...
...
...

これらの単純な割り当てを確認するために、ANTLRを使用して文法を作成しました。

今、私は課題の順序や意味をチェックするのに問題があります。既存の駐車場から継承できると仮定しましょう

carpark: my third carpark
extends: my second carpark

「私の2番目の駐車場」がすでに存在するかどうかを確認するにはどうすればよいですか?

さらに、色のような属性のいくつかをオプションにしたい、その他は必須であり、注文は重要ではないはずです

car: BMW
color: red
age: 4
//should be allowed as
car: BMW
age: 4
color: red

簡単なルールはそうでしょう

cardefinition
    :   CAR COLON value NEWLINE attributedefinition*
    ;

attributedefinition
    :   attributekey COLON value NEWLINE!
    ;

ただし、必須の属性は定義されない場合があります。必須のようなルールを追加することはできますが、任意の順序で定義を許可することは困難です

この種のチェックはパーサーまたはツリーパーサーの一部である必要があります

役に立ちましたか?

解決

君は できる 有効なスーパーパークのチェックを行います(extends ...)パーサーの文法の内部では、木の文法はあなたの(組み合わせた)文法の乱雑なバージョンではありません。だから私はそこでそのようなことをするのが好きです。

あなたができることは、aを作成することです Set<String> parks あなたのツリーウォーカーのメンバーとして:

tree grammar CarParkWalker;

options {
  tokenVocab=CarPark; // assuming your combined grammar is called CarPark.g
  ASTLabelType=CommonTree;
}

@members {
  private Set<String> parks = new HashSet<String>();
}

// rules here

そして、追加します StringASTが通過している間、それにs。その後、あなたがじゃらに出会ったとき extends VALUE, 、あなたはあなたがチェックするところにいくつかのカスタムコードを追加しますか VALUE.text あなたに存在します Set<String> parks. 。そうでない場合は、例外を投げます。

必須の自動車(またはカーパーク)のオプションの属性について、(組み合わせた)文法のゼロ以上のパラメーターを受け入れ、ツリー文法ルールを返してもらいます Vehicle 実例:

/* tree grammar rules! */

vehicle returns [Vehicle v]
  :  car        {$v = $car.v;}
  |  motorcycle {$v = $motorcycle.v;}
  ;

car returns [Vehicle v]
@init{$v = new Car();}
  :  ^(Car ... )
  ;

motorcycle returns [Vehicle v]
@init{$v = new Motorcycle();}
  :  ^(Motorcycle ... )
  ;

ここでa Vehicle 見えるかもしれません:

abstract class Vehicle {

  protected String make;
  protected String color;
  protected int age;
  protected int wheels;

  // ...
}

そして、すべての必須属性が設定されているかどうかを各車両のかどうかを確認します。

自分自身を試した後、あなたがこれをすべて実装するのに苦労しているなら、私はそれの少しのデモを投稿したいと思っています。その場合にコメントを追加するだけです。

幸運を!

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