Estoy tratando de entender a Alex y los lexers en general, pero estoy teniendo problemas para ejecutar mi Lexer.Haskell Alex - error en la plantilla del contenedor
Escribí lexers en envoltorios "básicos" y "posn" pero no pude en el envoltorio "monad". Creo que tengo que usar el contenedor monad
porque necesito recopilar cadenas y posiciones de tokens en la entrada. También necesito múltiples estados. Por ahora estoy tratando de ejecutar este sencillo exmaple:
{
module Main (main) where
}
%wrapper "monad"
$whitespace = [\ \b\t\n\f\v\r]
$digit = 0-9
$alpha = [a-zA-Z_]
$upper = [A-Z]
$lower = [a-z]
@tidentifier = $upper($alpha|_|$digit)*
@identifier = $lower($alpha|_|$digit)*
tokens :-
$whitespace+ ;
$upper $alpha+ { typeId }
$lower $alpha+ { id_ }
$digit+ { int }
{
data Lexeme = L AlexPosn LexemeClass String
data LexemeClass
= TypeId String
| Id String
| Int Int
| EOF
deriving (Show, Eq)
typeId :: AlexInput -> Int -> Alex Lexeme
typeId = undefined
id_ :: AlexInput -> Int -> Alex Lexeme
id_ = undefined
int :: AlexInput -> Int -> Alex Lexeme
int = undefined
alexEOF = return (L undefined EOF "")
main :: IO()
main = do
s <- getContents
let r = runAlex s $ do
return alexMonadScan
print r
}
Mis acciones son undefined
por ahora. Cuando intento compilar, lo estoy consiguiendo este error:
➜ haskell ghc --make Tokens.hs
[1 of 1] Compiling Main (Tokens.hs, Tokens.o)
templates/wrappers.hs:208:17:
Couldn't match expected type `(AlexPosn, Char, [Byte], String)'
with actual type `(t0, t1, t2)'
Expected type: AlexInput
Actual type: (t0, t1, t2)
In the return type of a call of `ignorePendingBytes'
In the first argument of `action', namely
`(ignorePendingBytes inp)'
También estoy consiguiendo varios errores cuando intento compilar ejemplos en github repo de Alex, podría estar relacionado con un conflicto de versiones? Instalé alex de cabal con ghc 7.0.4. ¿Algunas ideas?
Gracias! ¿Debo abrir un problema en su repositorio de GitHub? – sinan
@sinan: Sí, eso probablemente sería una buena idea. – hammar