Matching


Klíčová slova:  skip, thru, to, ahead, end, none, not, quote


PARSE skip

Bez argumentu přeskočí pouze jeden element:


Red[]


a:  ["fox" "dog" "owl" "rat" "elk" "cat"] ; input block


print parse a [   ; here the rules begin:

       "fox"        ; rule 1 matches element 1 => true

       skip         ; rule 2 skips this element

       "owl"        ; rule 3 matches element 3 => true

       "rat"        ; rule 4 matches element 4 => true

       "elk"        ; rule 5 matches element 5 => true

       "cat"        ; rule 6 matches element 6 => true          

]


true



S argumentem přeskočí zadaný počet elementů:


print parse "axxb" ["a" 2 skip "b"]


true



PARSE  to a thru

Přeskočí elementy až k označenému místu vstupního bloku. Slovo to nastaví počátek parsování před zadaný element, slovo thru nastaví počátek parsování za zadaný element.


       



PARSE  to


Red[]


a:  ["fox" "dog" "owl" "rat" "elk" "cat" "bat"]  ; input block


print parse a [    

       

       to "elk"                    ; přeskočí všechny elementy před "elk"

                           

       "elk" "cat" "bat"     ; zbytek je konformní s pravidlem                

]


true



PARSE  thru


Red[]


a:  ["fox" "dog" "owl" "rat" "elk" "cat" "bat"] ; input block


print parse a [

 

       thru "elk"        ; přeskočí všechny elementy včetně "elk"

       

    "cat" "bat"        ; zbytek je konformí s pravidlem        

    ]


true



Klíčové slovo thru je prospěšné, i když procedura skončí hodnocením false:


Red[]


s:  "dnes je nádherný den" 

parse s [thru "nádherný" change "" " a slunný"]


false


           s

       == "dnes je nádherný a slunný den"


K čemu zde došlo:

Vstupní řetězec byl konfrontován s příkazem ke skoku za slovo "nádherný", jehož následná mezera byla nahrazena doplňkem "  a slunný".


PARSE ahead

Zkontroluje, zda se následující (ahead) element shoduje s pravidlem.


Red[]


a:  ["fox" "dog" "owl" "rat"]        ; input block


print parse a [  

       "fox"        

       "dog"

       ahead "owl"             ;checks if the next item matches the rule

       "owl"

       "rat"     ]


true


Ve skutečnosti je to mnohem složitější - viz Ungaretti # while - ahead



PARSE end

Vrací true, jestliže byly pozitivně zkontrolovány všechny položky - což se vykoná i bez slova end.


Red[]


a:  [33 18.2 #"c" "rat"]                 ; input block


print parse a [ integer! float! char!        string! end ]


true


Poznámka: Slovo end označuje pozici na konci každé sekvence. Interpret si jej dosadí sám, pokud není uveden.


PARSE none

Vždycky vrací true.  Je to pravidlo pro všechny případy


Red[]


a:  ["fox" "dog" "owl" "rat"]  


print parse a ["fox" "dog"

        none (print "Servus")      ; příkaz print lze vložit i bez none!        

       "owl" "rat" ]


         

true



PARSE not        

Neguje platnost (existenci) následného "pravidla":


Red[]


              a:  ["fox" "dog" "owl" "rat"]


    print parse a ["fox" "dog" not "owl" "owl" "rat"]   ; museli jsme jedno "owl" přidat


true


         print parse a ["fox" "dog" not "owl" skip "rat"]    ; museli jsme "owl" přeskočit


true


PARSE quote nebo apostrof  '      

Match next value literaly (for dialect escaping needs).


Red[]


         parse  [x] ['x]


true


         parse  [[x]] [ quote [x]]


true