Brincando com Haskell, parte 1
Estou experimentando agora com sistemas de inferência de tipos, começando com um Hindley-Milner clássico, escrevendo o código em Haskell. Claro que para experimentar eu precisava de uma linguagem funcional simples, mas desta vez resolvi não ficar apenas na sintaxe abstrata: criar um parser e coisa e tal para poder escrever programas num formato razoável. Isso me levou a usar o Parsec, biblioteca de combinadores de parsers. Já tinha ficado impressionado antes vendo alguns exemplos, mas nunca tinha usado de verdade. E, realmente, é muito bom de usar, pelo menos para uma linguagem simples. O trabalho é feito definindo parsers algebricamente, de uma forma que espelha quase perfeitamente a forma da gramática em BNF. A documentação no site também ajuda bastante, tendo exemplos e casos de uso interessantes. Nada de usar um processador separado para gerar um parser quase incompreensível.
Como um pequeno exemplo, aqui está a definição que analisa a expressão condicional:
Isso significa que o parser vai procurar pela palavra reservada
Isso mostra de maneira bem clara que uma expressão de base é uma expressão
Como um pequeno exemplo, aqui está a definição que analisa a expressão condicional:
conditional :: Parser Exp
conditional = do reserved "if"
e1 <- expr
reserved "then"
e2 <- expr
reserved "else"
e3 <- expr
return (If e1 e2 e3)
Isso significa que o parser vai procurar pela palavra reservada
if
, depois chamar o parser para expressões para analisar a expressão booleana do condicional, depois procura a palavra reservada then
, e por aí vai. Outro exemplo interessante é um analisador parcial para expressões básicas (que podem aparecer como fatores de expressões com operadores):
baseExp :: Parser Exp
baseExp = letexpr <|> conditional <|> variable <|> numberLiteral <|>
booleanLiteral <|> parens expr
> "basic expression"
Isso mostra de maneira bem clara que uma expressão de base é uma expressão
let
, um condicional, uma variável, um literal (numérico ou booleano) ou uma expressão entre parênteses. Cada um desses como letexpr
que são operados com <|>
são parsers de algum tipo de expressão. O operador <?>
permite que o parser seja descrito, para ajudar na composição de mensagens de erro significativas.
0 Comments:
Post a Comment
<< Home