Parse



Parse é um "dialeto" do Red (um DSL- domain specific language para ser preciso), isto é, uma mini linguagem embutitda dentro do Red. O interpretador Red que vem com o download já possui algumas destas linguagens: VID para criação de GUIs, DRAW para gráficos e PARSE.

Parse deve ser estudado como uma pequena linguagem de programação.

native! parse


parse pega cada elemento de um input e o submete a uma regra correspondente em um bloco de regras. Retorna true se todas as regras forem atendidas ou false, se alguma falhar (fracassar) em atender à respectiva regra.


O exemplo mais básico seria simplesmente checar se cada elemento do bloco de input é igual ao elemento correspondente no bloco de regras;


Red[]


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

print parse a ["fox" "dog" "owl" "rat" "elk" "cat"]


true


Para deixar mais clara a descrição do parse, vou reescrever o exemplo acima com outra formatação:


Red[]


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


print parse a [   ;aqui começam as regras:

       "fox"  ; elemento 1 atende regra 1 => sucesso

       "dog"  ; elemento 2 atende regra 2 => sucesso

       "owl"  ; elemento 3 atende regra 3 => sucesso

       "rat"  ; elemento 4 atende regra 4 => sucesso

       "elk"  ; elemento 5 atende regra 5 => sucesso

       "cat"  ; elemento 6 atende regra 6 => sucesso  

]

; como todos os elementos atendem às suas regras, o resultado é "true"


true


A correspondência pode ser com datatypes:


Red[]


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


print parse a [  

       integer!        

       float!

       char!

       string!

]


true

Código normal do Red pode ser inserido dentro do bloco de regras usando parêntesis:


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


As regras aceitam o operador lógico "ou" representado por "|":


Red[]


a: ["fox" "rat" "elk"]        

b: ["fox" "owl" "elk"]        


print parse a [  

       "fox"

       ["rat" | "owl"]                ;note os colchetes

       "elk"  

]

print parse b [  

       "fox"

       ["rat" | "owl"| "cat" | "whatever"]

       "elk"  

]


true

true


As regras podem ser repetidas adicionando o número de repetições (ou intervalo) antes delas:


Red[]


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


print parse a [  

   4 skip        ; see command skip at Parse/Matching

       "elk"  

       "cat"    

]


true


Red[]


a:  ["rat" "rat" "rat" "rat" "elk" "cat"]


print parse a [  

   4 "rat"

       "elk"  

       "cat"    

]


true


Ou intervalo:


Red[]


a:  ["rat" "rat" "elk" "cat"]


print parse a [  

   0 4 "rat"        ; will return success if there is from zero up to four "rat"

       "elk"  

       "cat"    

]


true



Refinamentos do Parse:


    /case        =>

    /part        =>

    /trace       =>



Esclarecimento importante:


O comando parse retorna true ou false, mas o matching (tentativa de ver se a entrada atende à regra) envia ao parse sucesso ou fracasso  (success ou failure). É importante entender isso para não fazer confusão.