0

アレックスとハッピーを使ってパーサーを作ろうとしています。この投稿の指示に従っていますが、問題があります。次のタイプのエラーの原因を突き止めようとしています。

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)
}

そして Lex.x:

{
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
}
4

1 に答える 1

1

template/wrappers.hsalex リポジトリでソースを見つけることができます:

https://github.com/simonmar/alex/tree/master/templates

提供された上でalexを実行すると、次のLex.xエラーが発生しました:

alex: (Array.!): undefined array element

実際の例を教えていただければ、問題を追跡できます。

于 2015-08-02T17:56:38.220 に答える