Parse
Parse je vnořený jazyk (DSL - Domain Specific Language) pro parsování vstupních řad (series) s použitím gramatických pravidel tohoto jazyka. Používá se pro ověření shody, vyjímání a úpravu vstupních dat. Ve všech případech se používá funkce parse v této skladbě:
parse < input > < rules >
<input> : jakákoli hodnota řady (any-string!, any-block!, binary!)
<rules> : blok s pravidly
Parsování začíná na začátku vstupní řady. Při úspěšné konfrontaci s pravidly (success) postupuje k dalšímu členu řady. Parsování končí výskytem neúspěchu a operace vrací FALSE nebo úspěšným průchodem celou vstupní řadou a operace vrací TRUE.
Významnou úlohu při sestavování gramatických pravidel mají klíčová slova, která lze rozdělit do několika kategorií:
Ověření shody:
ahead, end, none, not, quote, skip, thru to
Průběh parsování:
break, if, into, fail, then, reject
Iterace:
some, any, opt, while
Extrakce a uložení:
set, copy, keep, collect, collect-set, collect-into
Modifikace:
insert, remove, change
native! parse
Funkce parse podrobí každý element vstupu porovnání s odpovídajícím blokem pravidel. Podmínkou přechodu k ověřování dalšího vstupního elementu je úspěšné hodnocení předchozího. Funkce vrací true, konvenují-li všechny elementy vstupní řady se zadanými pravidly, případně vrací false, pokud tomu tak není.
Nejjednodušším příkladem je prostá kontrola, zda každý element vstupního bloku je roven svému protějšku v bloku pravidel:
Red[]
a: ["fox" "dog" "owl" "rat" "elk" "cat"] ; vstupní blok
print parse a ["fox" "dog" "owl" "rat" "elk" "cat"] ; kontrolní blok
true
Pro větší přehlednost popisu parse, přepišme výše uvedený příklad do jiného formátu. Kontrolní blok se formálně skládá ze šesti pravidel:
Red[]
a: ["fox" "dog" "owl" "rat" "elk" "cat"] ; input block
print parse a [ ; here the rules begin:
"fox" ; rule 1 matches element 1 => success
"dog" ; rule 2 matches element 2 => success
"owl" ; rule 3 matches element 3 => success
"rat" ; rule 4 matches element 4 => success
"elk" ; rule 5 matches element 5 => success
"cat" ; rule 6 matches element 6 => success
]
; protože všechny konfrontace byly úspěšné, a došli jsme na konec řady
; je výsledkem "true"
true
Vstupní blok lze porovnávat i s datovými typy:
Red[]
a: [33 18.2 #"c" "rat"] ; input block
print parse a [
integer!
float!
char!
string!
]
true
Do kontrolního bloku (pravidel) lze vložit běžný kód v závorce:
Red[]
a: ["fox" "dog" "owl" "rat" "elk"] ; input block
print parse a [
"fox"
"dog"
"owl"
(loop 3 [print "just regular code here!"])
"rat"
"elk"
]
just regular code here!
just regular code here!
just regular code here!
true
V pravidlech lze použít operátor logického "OR" ( "|" ) :
Red[]
a: ["fox" "rat" "elk"]
b: ["fox" "owl" "elk"]
print parse a [
"fox"
["rat" | "owl"] ; alternativně použitelné hodnoty
"elk"
]
print parse b [
"fox"
["rat" | "owl"| "cat" | "whatever"]
"elk"
]
true
true
Obsah vstupního bloku lze upravit zadaným vypuštěním elementů:
Red[]
a: ["fox" "dog" "owl" "rat" "elk" "cat"]
print parse a [
4 skip ; přikázaný skok příkazem "4 skip"
"elk"
"cat"
]
true
Red[]
a: ["rat" "rat" "rat" "rat" "elk" "cat"]
print parse a [
4 "rat" ; počet stejných prvků
"elk"
"cat"
]
true
Red[]
a: ["rat" "rat" "elk" "cat"]
print parse a [
0 4 "rat" ; počet stejných prvků zadán přípustným rozsahem
"elk"
"cat"
]
true
Introspekce prováděného průběhu parse:
parse-trace < input > < rules >
Upřesnění funkce parse:
/case =>
/part =>
/trace =>