2016-03-21 3 views
5

正規表現、トークンまたはルールを使用すると、そういう変数を定義することができます。

token directive { 
    :my $foo = "in command"; 
    <command> <subject> <value>? 
} 

S05 - Regexes and Rulesにおける言語のドキュメントhereで、それについては何も、非常に少ないがquoteに、ありません。

文法正規表現は本当に単なる一種のメソッドです。このようなルーチンでは、コロンとそれに続くmy、our、state、およびconstantを含むPerl 6文法で解析されたスコープ宣言子を使用して変数を宣言できます。 (アップ終端セミコロンまたはライン最終の閉じ中括弧を介して)、単一の文が正常Perl 6のコードとして解析される(準宣言子、TEMPおよびletも認識されるように。):

token prove-nondeterministic-parsing { 
    :my $threshold = rand; 
    'maybe' \s+ <it($threshold)> 
} 

Iが内regexenこと得ます文法はクラスのメソッドと非常によく似ています。ルールのどこにでもブロックを開始することができます。そして、解析が成功すればブロックが実行されますが、私はこのことが何であるかを理解していません。

スコープの定義を明確にすることはできますか。それが必要とするものを説明し、典型的なユースケースを教えてください。

答えて

7

:my $foo;にはどのようなスコープがありますか?

:my $foo ...;には、/ token/regexルールのlexical scopeが表示されます。

(そして:my $*foo ...; - 動的変数を意味余分*に注意してください - 。それが表示されるルール/トークン/正規表現の字句とdynamic scopeの両方を持っている)

これは

のために使用されるもの

regex scope-too-small { # Opening `{` opens a regex lexical scope. 
    { my $foo =/bar/} # Block with its own inner lexical scope. 
    $foo     # ERROR: Variable '$foo' is not declared 
} 

grammar scope-too-large { # Opening `{` opens lexical scope for gramamr. 
    my $foo =/bar/; 
    regex r1 { ... }  # `$foo` is recognized inside `r1`... 
    ... 
    regex r999 { ... }  # ...but also inside r999 
} 

ので: ... ;構文は正確にデザイアーズを取得するために使用されます。

はここせずにこの構造をを何が起こるかですスコープが広すぎたり狭すぎたりすることはありません。

典型的な使用例

この機能は、一般的に(バグを生む)緩いスコープを避けるために、大規模で複雑な文法で使用されています。正確語彙のみtoken babble as defined in a current snapshot of Rakudo's Grammar.nqp source code@extra_tweaksの宣言および使用を参照スコープの好適例えば

P6サポートaction objects。これらは、文法の規則と1対1に対応するメソッドを持つクラスです。ルールが一致するたびに、対応するアクションメソッドが呼び出されます。 Dynamic variablesは、レキシカルとダイナミックの両方で宣言されているブロック(メソッド、ルールなど)にスコープされている変数を宣言するための正確なスコープを提供します。後者は対応するアクションメソッドでも利用可能です。たとえば、the declaration of @*nibbles in Rakudo's Grammar moduleおよびits use in Rakudo's Actions moduleを参照してください。

関連する問題