Я пытаюсь понять Алекса и лексеров вообще, но мне трудно запустить мой лексер.Haskell Alex - ошибка в шаблоне обертки
Я написал лексеры в обложках «basic» и «posn», но не смог в оболочке «monad». Я думаю, что мне нужно использовать обертку monad
, потому что мне нужно собирать строки и позиции токенов во входных данных. Мне также нужны несколько состояний. Сейчас я пытаюсь запустить эту простую 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
}
Мои действия undefined
сейчас. Когда я пытаюсь скомпилировать его, я получаю эту ошибку:
➜ 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)'
Я также получаю различные ошибки, когда я пытаюсь собрать примеры в GitHub репо Алекса, может ли это быть связано с несоответствием версии? Я установил alex из cabal с ghc 7.0.4. Есть идеи?
Спасибо! Должен ли я открыть проблему в репозитории GitHub? – sinan
@sinan: Да, это, вероятно, будет хорошей идеей. – hammar