2016-03-21 1 views
5

Con un'espressione regolare, token o regola, è possibile definire una variabile come tale;

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

Non c'è nulla nella documentazione di lingua here, e molto poco in S05 - Regexes and Rules, per citare;

Qualsiasi espressione regolare di grammatica è in realtà solo un tipo di metodo e si possono dichiarare variabili in tale routine utilizzando i due punti seguiti da qualsiasi dichiaratore di ambito analizzato dalla grammatica di Perl 6, inclusi my, our, state e constant. (. Come dichiaratori quasi, temperatura e lasciare che sono anch'essi iscritti) Una singola istruzione (attraverso un punto e virgola finale o una linea di finale di chiusura brace) viene analizzato come normale codice Perl 6:

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

Ottengo che regexen all'interno le grammatiche sono molto simili ai metodi nelle classi; Capisco che è possibile avviare un blocco ovunque all'interno di una regola e se l'analisi riesce a raggiungere quel punto, il blocco verrà eseguito - ma non capisco cosa diavolo sia per questa cosa.

Qualcuno può definire chiaramente che cos'è lo scopo? spiegare quale necessità soddisfa e dare il tipico caso d'uso?

risposta

7

Quali possibilità :my $foo; ha?

:my $foo ...; ha il lexical scope della regola/token/regex in cui appare.

(E :my $*foo ...; - nota l'extra * significare una variabile dinamica -. Ha sia la lessicale e dynamic scope della regola/gettone/regex in cui compare)

Che cosa questo viene utilizzato per

ecco cosa succede senza questo costrutto:

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 
} 

Così la sintassi : ... ; viene utilizzato per ottenere esattamente il desir ambito di applicazione - né troppo ampio né troppo stretto.

casi

Questa funzione utilizzo tipico è tipicamente utilizzati nelle grammatiche grandi o complessi per evitare scoping lassista (che alleva bachi).

Per un esempio adatto di preciso lessicale solo scoping vedere la dichiarazione e l'utilizzo @extra_tweaks in token babble as defined in a current snapshot of Rakudo's Grammar.nqp source code.

P6 supporta action objects. Si tratta di classi con metodi corrispondenti one-to-one con le regole in una grammatica. Ogni volta che una regola corrisponde, chiama il suo metodo di azione corrispondente. Dynamic variables forniscono esattamente lo scoping corretto per dichiarare le variabili che sono scoped al blocco (metodo, regola, ecc.) Che sono dichiarate sia in modo lessicale che dinamico - il che significa che sono disponibili anche nel metodo di azione corrispondente. Per un esempio, vedere the declaration of @*nibbles in Rakudo's Grammar module e its use in Rakudo's Actions module.