Haskell Alex - error en la plantilla de envoltura
Estoy tratando de entender a Alex y a los lexers en general, pero tengo problemas para ejecutar mi lexer.
Escribí lexers en envoltorios "básicos" y "posn", pero no pude en el envoltorio "mónada". Creo que tengo que usarmonad
envoltorio porque necesito recopilar cadenas y posiciones de token en la entrada. También necesito múltiples estados. Por ahora estoy tratando de ejecutar este ejemplo simple:
<code>{ 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 } </code>
Mis acciones sonundefined
por ahora. Cuando intento compilarlo, aparece este error:
<code>➜ 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)' </code>
También estoy recibiendo varios errores cuando intento compilar ejemplos en el repositorio de github de Alex, ¿podría estar relacionado con una falta de coincidencia de versiones? He instalado alex de cabal con ghc 7.0.4. ¿Algunas ideas?