Haskell Alex - ошибка в шаблоне оболочки
Я пытаюсь понять Алекса и лексеров в целом, но у меня возникают проблемы с запуском моего лексера.
Я написал лексеры в "Basic" и "posn" обертки, но я не могу в "монаде" обертка. Я думаю, что я должен использоватьmonad
обертка, потому что мне нужно собирать строки и токены позиции на входе. Мне также нужно несколько состояний. Сейчас я пытаюсь запустить этот простой пример:
<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>
Мои действияundefined
теперь. Когда я пытаюсь его скомпилировать, я получаю эту ошибку:
<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>
Я также получаю различные ошибки, когда пытаюсь скомпилировать примеры в репозитории Alex GitHub, может ли это быть связано с несовпадением версий? Я установил alex из cabal с ghc 7.0.4. Есть идеи?