3

構文仕様の*andの意味に少し混乱しています。+私は次のようなものを期待しています

rascal>syntax Statement = "{" {Statement ";"}* "}";

セミコロンで区切られて終了するステートメントのブロックを意味します。しかし、ドキュメントには次のように書かれています:

セミコロンで区切られたステートメントのブロック

一部のコードでは、そのような構文仕様によりステートメントのようなステートメント{ x = 1; x }を解析できることがわかります。なぜそうなのですか?

4

1 に答える 1

5

分割リストと通常のリストの表記が異なるだけです。で終わるステートメントのリストは;、シーケンス演算子: を使用して表現できます(...)

例えば:

 (Expr ";")* 

受け入れます

 1; 2; 3;

その間

 {Expr ";"}*

final;で解析エラーを生成し、むしろ受け入れます:

 1; 2; 3

分離されたリストには、Rascal のパターン マッチングと構築機能でも特別なセマンティクスがあります。たとえば具体的な構文を使用して一致させる場合、空のサブリストは、前後の区切り文字が無視されることを意味します。

 ({Expr ","}*) `1 ; <{Expr ","}* rest>` := ({Expr ","}*) `1`;

restこのパターンは成功し、パターン内のを無視して式の空のリストを にバインドし;ます。

同様に、新しいリストを作成する場合:

 ({Expr ","}*) `1 ; <{Expr ","}* rest>`

空だったので、構築されたリストからを単純に生成1して削除します。;rest

分離リストは通常​​、関数定義や関数適用などで仮パラメータと実パラメータのリストを定義するために使用されます。通常、セミコロンを含むステートメントには区切り記号を使用しません。

于 2013-10-31T20:01:49.080 に答える