ANTLR-値のセマンティクス/意味を確認します
-
26-10-2019 - |
質問
ユーザーが属性を持ついくつかのオブジェクトを定義できる簡単な文法があります。例えば:
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
そして、追加します String
ASTが通過している間、それに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;
// ...
}
そして、すべての必須属性が設定されているかどうかを各車両のかどうかを確認します。
自分自身を試した後、あなたがこれをすべて実装するのに苦労しているなら、私はそれの少しのデモを投稿したいと思っています。その場合にコメントを追加するだけです。
幸運を!