Estoy tratando de aprender Parsec implementando un pequeño analizador de expresiones regulares. En BNF, mi gramática se ve algo como:Usando Parsec para analizar expresiones regulares
EXP : EXP *
| LIT EXP
| LIT
He tratado de implementar esto en Haskell como:
expr = try star
<|> try litE
<|> lit
litE = do c <- noneOf "*"
rest <- expr
return (c : rest)
lit = do c <- noneOf "*"
return [c]
star = do content <- expr
char '*'
return (content ++ "*")
Hay algunos bucles infinitos aquí, sin embargo (por ejemplo expr -> estrella -> expr sin consumir ningún token) que hace que el analizador bucle por siempre. Aunque no estoy seguro de cómo solucionarlo, porque la naturaleza misma de star
es que consume su token obligatorio al final.
¿Alguna idea?
Wow. Eso es tan fácil que casi se siente como hacer trampa. – Xodarap
Habría sido incluso más fácil si 'Secuencia, Elección :: Término -> Término -> Término 'en lugar de' [Término] -> Término', pero supongo que demuestra cómo tratar con un AST que no coincide exactamente el árbol de análisis sintáctico ... – pat