Я пытаюсь сделать парсер с помощью Alex with Happy. Я следую инструкциям из этот пост, но с бедой. Я пытаюсь отследить источник ошибки следующего типа:
templates/wrappers.hs:234:9:
Couldn't match type ‘Token’ with ‘Int -> Alex Token’
Expected type: AlexInput -> Int -> Alex Token
Actual type: String -> Token
In a stmt of a 'do' block: action (ignorePendingBytes inp) len
In the expression:
do { alexSetInput inp';
action (ignorePendingBytes inp) len }
In a case alternative:
AlexToken inp' len action
-> do { alexSetInput inp';
action (ignorePendingBytes inp) len }
Мой лексер находится в src/AnsiParser/FrontEnd/Lex.x. Итак, я заглянул в dist/build/AnsiParser/FrontEnd/Lex.hs, и все, что я смог найти, это:
{-# LINE 1 "templates/wrappers.hs" #-}
{-# LINE 1 "templates/wrappers.hs" #-}
Но я не могу найти файлы с именем «wrapper.hs» в своей системе. Как я могу отследить причину этой ошибки?
Если это будет полезно, вот уменьшенная версия моего Parse.y:
{
module AnsiParser.FrontEnd.Parse where
import AnsiParser.FrontEnd.Lex
}
%name parseTokens
%tokentype { Token }
%lexer { lexWrap } { alexEOF }
%monad { Alex }
%error { parseError }
%token
-- tokens
%%
-- rules
{
parseError :: Token -> Alex a
parseError tokens = error ("Error!" ++ show tokens)
}
И Лекс.х:
{
module AnsiParser.FrontEnd.Lex where
}
%wrapper "monad"
tokens :-
-- tokens
{
data Token
= -- token types
| TokenEOF
deriving (Show)
scanTokens = alexMonadScan
lexWrap :: (Token -> Alex a) -> Alex a
lexWrap = (alexMonadScan >>=)
alexEOF :: Alex Token
alexEOF = return TokenEOF
}