Eu tenho esta gramática raku:
#!/usr/bin/env raku
use v6.d;
use Grammar::Tracer;
grammar Grammar {
token TOP {
<city> \v
<state-zip> \v?
}
token city {
^^ \V* $$
}
token state-zip {
^^ <state> <.ws>? <zipcode> $$ #<.ws> is [\h* | \v]
}
token state {
\w \w
}
token zipcode {
\d ** 5
}
}
class Actions {
method TOP($/) {
#works
say "city is ", $_ with $<city>.made;
say "state is ", $_ with $<state-zip><state>.made;
say "zipcode is ", $_ with $<state-zip><zipcode>.made;
#doesn't work
say "state2 is ", $_ with $<state>.made;
say "zipcode2 is ", $_ with $<zipcode>.made;
}
method city($/) { make ~$/ }
method state($/) { make ~$/ }
method zipcode($/) { make ~$/ }
}
my $address = q:to/END/;
Springfield,
IL 62704
END
Grammar.parse($address, :actions(Actions));
Funciona muito bem:
TOP
| city
| * MATCH "Springfield,"
| state-zip
| | state
| | * MATCH "IL"
| | zipcode
| | * MATCH "62704"
| * MATCH "IL 62704"
city is Springfield,
state is IL
zipcode is 62704
* MATCH "Springfield,\nIL 62704\n"
token <state-zip>
existe para permitir que o estado e o zip residam em uma única linha ou para abranger várias linhas. Lembre-se que se trata de um MRE, por isso procuro respostas que não alterem a Gramática, mas sim os aspectos make/made das Ações.
MAS - para agilizar meu código, gostaria de poder acessar o estado e o CEP no nível superior da method TOP($/) {}
ação de acordo com meus exemplos state2 e zipcode2. Tenho tentado "levantar" os valores de estado criados e tokenizar a árvore de correspondência - por exemplo, talvez algo como:
# doesn't work
method TOP($/) {
make $<state>.made;
make $<zip>.made;
...
}
method state-zip($/) {
make $<state>.made;
make $<zip>.made;
}
Isso é possível?