1

パーサーを書きたかったので、haskell と alex/happy を取り上げました。しかし、私はこの問題に遭遇しました:

ソース: lexer.x

{
module ValkenLexer where

strip :: String -> String
strip s = take ((length s) - 2) (drop 1 s)
}

%wrapper "basic"

$digit = 0-9
$alpha = [a-zA-Z]

tokens :-
  $white+                           ;
  $alpha+                               { \s -> TokIdent s }
  \"[^\"]*\"                       { \s -> TokStr strip(s) }
  =                                     { \s -> TokSlash}
  \|                                    { \s -> TokPipe }
  \/                                    { \s -> TokSlash }
  \n                                    { \s -> TokEol}
  \%$alpha+                              { \s -> TokVar (drop 1 s)}

{

data Token = TokIdent String
           | TokStr String
           | TokEq
           | TokPipe
           | TokSlash
           | TokEol
           | TokVar String
             deriving (Eq,Show)

}

そして得た:

\->>> alex lexer.x && ghc lexer.hs
[1 of 1] Compiling ValkenLexer      ( lexer.hs, lexer.o )

lexer.hs:15:1: parse error on input `import'

私は何を間違っていますか?

4

1 に答える 1

3

Daniel Wagner が予測したように、関数定義はフッターに配置する必要があります。ヘッダーには、モジュール宣言とインポート ステートメントのみを配置できます。TokStr strip(s)さらに、次のように変更する必要がありますTokStr (strip s)

{
module ValkenLexer where
}

%wrapper "basic"

$digit = 0-9
$alpha = [a-zA-Z]

tokens :-
  $white+                           ;
  $alpha+                               { \s -> TokIdent s }
  \"[^\"]*\"                       { \s -> TokStr (strip s) }
  =                                     { \s -> TokSlash}
  \|                                    { \s -> TokPipe }
  \/                                    { \s -> TokSlash }
  \n                                    { \s -> TokEol}
  \%$alpha+                              { \s -> TokVar (drop 1 s)}

{
strip :: String -> String
strip s = take ((length s) - 2) (drop 1 s)

data Token = TokIdent String
           | TokStr String
           | TokEq
           | TokPipe
           | TokSlash
           | TokEol
           | TokVar String
             deriving (Eq,Show)
}
于 2013-10-07T14:27:37.487 に答える