Ich versuche, Alex und Lexer im Allgemeinen zu verstehen, aber ich habe Probleme, meinen Lexer zu laufen.Haskell Alex - Fehler in Wrapper-Vorlage
Ich schrieb Lexer in "Basic" und "POSN" Wrapper, aber ich konnte nicht in "Monad" Wrapper. Ich denke, ich muss monad
Wrapper verwenden, weil ich Strings und Token-Positionen in der Eingabe sammeln muss. Ich brauche auch mehrere Zustände. Denn jetzt versuche ich, diese einfache exmaple auszuführen:
{
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
}
Meine Handlungen undefined
sind für jetzt. Wenn ich versuche, es zu kompilieren, erhalte ich diese Fehlermeldung:
➜ 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)'
ich auch verschiedene Fehler bekommen, wenn ich versuche Beispiele in Alex 'GitHub Repo zu kompilieren, es mit einem Versionskonflikt in Verbindung stehen könnte? Ich habe Alex von cabal mit ghc 7.0.4 installiert. Irgendwelche Ideen?
Danke! Sollte ich ein Problem in seinem GitHub Repo öffnen? – sinan
@sinan: Ja, das wäre wahrscheinlich eine gute Idee. – hammar