Tôi đang cố gắng hiểu Alex và lexers nói chung nhưng tôi gặp khó khăn để chạy lexer của tôi.Haskell Alex - lỗi trong mẫu wrapper
Tôi đã viết lexers trong trình bao bọc "cơ bản" và "posn" nhưng tôi không thể trong trình bao bọc "đơn nguyên". Tôi nghĩ rằng tôi phải sử dụng monad
wrapper vì tôi cần phải thu thập các chuỗi và vị trí mã thông báo trong đầu vào. Tôi cũng cần nhiều tiểu bang. Hiện tại, tôi đang cố chạy exmaple đơn giản này:
{
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
}
Hành động của tôi là undefined
hiện tại. Khi tôi cố gắng biên dịch nó, tôi nhận được lỗi này:
➜ 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)'
Tôi cũng nhận lỗi khác nhau khi tôi cố gắng biên dịch ví dụ trong repo github của Alex, nó có thể liên quan với một phiên bản không phù hợp? Tôi đã cài đặt alex từ cabal với ghc 7.0.4. Bất kỳ ý tưởng?
Cảm ơn! Tôi có nên mở một vấn đề trong repo GitHub của nó? – sinan
@sinan: Vâng, đó có thể là một ý tưởng hay. – hammar