Parse - Ordered Choices
Regras aceitam um operador "escolha ordenada", representado por "|"
Se um bloco de regras separado por "|" é encontrado pelo parse, ele tentará cada regra, da esquerda para a direita até encontrar uma correspondência, retornando sucesso e indo para a próxima regra após este bloco. Se nenhum deles resultar em uma correspondência, é claro, ele falhará e a análise será interrompida retornando false.
Isso é semelhante a um operador lógico "ou" , mas a ordem é importante.
Exemplo1:
Red[]
a: ["fox" "rat" "elk"]
b: ["fox" "owl" "elk"]
print parse a [
"fox"
["rat" | "owl"] ;notice enclosing brackets
"elk"
]
print parse b [
"fox"
["rat" | "owl"| "cat" | "whatever"]
"elk"
]
true
true
Exemplo 2:
Red[]
print parse ["this is a string"] [ integer! (print "integer") | string! (print "string") | char! (print "char")]
string
true
Exemplo3:
Red[]
a: ["string" 3 #"A"] ; that is a string!, an integer! and a char!
print parse a [integer! (print "I") | string! (print "S") | time! (print "T")]
S
false
Repetindo o script com parse-trace em vez de print parse (destaques de cor, novas linhas, fonte em negrito e comentários adicionados por edição):
-->
match: [integer! (print "I") | string! (print "S") | time
input: ["string" 3 #"A"]
==> not matched
match: [string! (print "S") | time! (print "T")]
input: ["string" 3 #"A"]
==> matched
;keeps going to execute commands in parenthesis
match: [(print "S") | time! (print "T")]
input: [3 #"A"]
S
match: [| time! (print "T")]
input: [3 #"A"]
return: false ;too much input and not enough rules -> false
Para obter true , podemos adicionar mais regras para a escolha ordenada bem sucedida ...
Red[]
a: ["string" 3 #"A"] ; that is a string!, an integer! and a char!
print parse a [integer! (print "I") | string! (print "S") integer! char! | integer! (print "T")]
S
true
... ou colocar as escolhas ordenadas entre parênteses e adicionar regras ao bloco de regras principal:
Red[]
a: ["string" 3 #"A"] ; that is a string!, an integer! and a char!
print parse a [[integer! (print "I") | string! (print "S") | time! (print "T")] integer! char!]
S
true