Difference between revisions of "Monada parserelor"
Line 1: | Line 1: | ||
Realizarea unui parser modular din parsere mai mici, fie ca ele sunt din biblioteca ParseLib sau din biblioteca Parsec nu se poate face daca nu exista o structura algebrica a combinarii lor. E la fel ca la operatiile cu numere. Acolo calculele cu numere n-ar decurge asa cum stim daca n-ar exista proprietatile algebrice ale structurilor formate de numere (grup, corp, inel formate cu numerele Reale, de exemplu). |
Realizarea unui parser modular din parsere mai mici, fie ca ele sunt din biblioteca ParseLib sau din biblioteca Parsec nu se poate face daca nu exista o structura algebrica a combinarii lor. E la fel ca la operatiile cu numere. Acolo calculele cu numere n-ar decurge asa cum stim daca n-ar exista proprietatile algebrice ale structurilor formate de numere (grup, corp, inel formate cu numerele Reale, de exemplu). |
||
− | Pentru a descrie monada parsererlor trebuie definiti cei doi operatori: |
+ | Pentru a descrie monada parsererlor trebuie definiti cei doi operatori:>>== si return. Ceea ce se face ca mai jos: <br> |
+ | <nowiki> |
||
− | >>== |
||
+ | instance Monad Parser where </nowiki> <br> <nowiki> |
||
+ | return a = Parser (\cs -> [(a,cs)]) </nowiki> <br> <nowiki> |
||
+ | p >>= f = Parser (\cs -> concat [ parse (f a) cs' | (a,cs') <- parse p cs]) </nowiki> <br> |
||
+ | dar nu uitati sa indentati ultimele doua randuri. Iar functia parse e definita: <br> |
||
− | return |
||
+ | |||
+ | parse :: Parser a -> String -> [(a,String)] <br> |
||
+ | parse (parser p) = p <br> |
||
Monada este folosita la realizarea front-end-urilor de interpretoare. |
Monada este folosita la realizarea front-end-urilor de interpretoare. |
Revision as of 11:00, 15 January 2007
Realizarea unui parser modular din parsere mai mici, fie ca ele sunt din biblioteca ParseLib sau din biblioteca Parsec nu se poate face daca nu exista o structura algebrica a combinarii lor. E la fel ca la operatiile cu numere. Acolo calculele cu numere n-ar decurge asa cum stim daca n-ar exista proprietatile algebrice ale structurilor formate de numere (grup, corp, inel formate cu numerele Reale, de exemplu).
Pentru a descrie monada parsererlor trebuie definiti cei doi operatori:>>== si return. Ceea ce se face ca mai jos:
instance Monad Parser where
return a = Parser (\cs -> [(a,cs)])
p >>= f = Parser (\cs -> concat [ parse (f a) cs' | (a,cs') <- parse p cs])
dar nu uitati sa indentati ultimele doua randuri. Iar functia parse e definita:
parse :: Parser a -> String -> [(a,String)]
parse (parser p) = p
Monada este folosita la realizarea front-end-urilor de interpretoare.
Aici mai sunt multe de adaugat. Pagina mai trebuie dezvoltata.