2016-03-21 10 views
5

Za pomocą wyrażenia regularnego, tokena lub reguły można zdefiniować zmienną taką jak ta;

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

Nie ma nic o tym w dokumentacji języka here, a bardzo niewiele S05 - Regexes and Rules, zacytować;

Każde wyrażenie gramatyczne jest tak naprawdę rodzajem metody i możesz zadeklarować zmienne w takiej procedurze, używając dwukropka, a następnie dowolnego deklaratora zasięgu analizowanego przez gramaturę Perla 6, w tym mój, nasz, stan i stałą. (. Jako quasi declarators, temp i niech są również rozpoznawane) pojedynczej instrukcji (maksymalnie przez średnikiem zakończenia lub składzie końcowym zamykanie nawiasów) jest analizowany jako normalnego kodu Perl 6:

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

mogę tego regexen zasięgu gramatyki są bardzo podobne do metod w klasach; Rozumiem, że możesz uruchomić blok w dowolnym miejscu w ramach reguły i jeśli parsowanie zakończy się powodzeniem, blok zostanie wykonany - ale nie rozumiem, po co to jest.

Czy ktoś może jasno określić, jaki jest zakres; wyjaśnić, jakie to musi spełniać i podać typowy przypadek użycia?

Odpowiedz

7

Jaki zakres ma :my $foo;?

:my $foo ...; ma lexical scope reguły/tokenu/regex, w którym się pojawia.

(I :my $*foo ...; - zwróć uwagę na dodatkową * oznaczający zmienną dynamiczną. - ma zarówno leksykalne i dynamic scope reguły/tokena/regex w którym wydaje)

Co to jest wykorzystywane do

Oto co się dzieje bez ten konstrukt:

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 
} 

więc składnia : ... ; jest używany, aby uzyskać dokładnie Desir ed zakres - ani zbyt szeroki, ani zbyt wąski.

przypadki użycia Typowe

Funkcja ta jest zazwyczaj używana w dużych lub złożonych gramatyk uniknąć luźnej scopingu (co rodzi błędy).

odpowiedniego przykładu precyzyjny leksykalny tylko określenie zakresu zobaczyć deklarację i wykorzystania @extra_tweaks w token babble as defined in a current snapshot of Rakudo's Grammar.nqp source code.

P6 obsługuje action objects. Są to klasy z metodami odpowiadającymi jeden do jednego z regułami w gramatyce. Za każdym razem, gdy reguła się zgadza, wywołuje odpowiednią metodę działania. Dynamic variables zapewnia precyzyjne określenie zakresu dla deklarowania zmiennych, które są ograniczone do bloku (metoda, reguła, itd.), Które są zadeklarowane w leksykalny i dynamiczny sposób - co oznacza, że ​​są one dostępne również w odpowiedniej metodzie akcji. Na przykład zobacz: the declaration of @*nibbles in Rakudo's Grammar module i its use in Rakudo's Actions module.