1

Haskell に適したパーサー生成システムのエラー メッセージを理解するのにいくつか問題があります。

たとえば、このコード

{
module Test_parser where

import System.IO
import Test_lexer

}

%name parse

%tokentype { Token }
%error { parseError }

%token

    true                { TokenTrue posn }
    false               { TokenFalse posn }
    number              { TokenInteger posn $$ }

%%

LiteralExpr :
        true            {LiteralTrue ()}
    | false         {LiteralFalse ()}
    | number        {LiteralInteger () $1}

{

data Expression n =
    LiteralTrue n
    | LiteralFalse n
    | LiteralInteger n Integer
        deriving (Eq, Show)

parseError xs = error "Parse error"

main = do 
  inStr <- getContents
  let parseTree = parse (alexScanTokens inStr)  
  putStrLn $ show(parseTree)
}

正常に動作します。

でもそんなことしたら

....

LiteralExpr :
    true            {LiteralTrue ()}
    | false         {LiteralFalse ()}
    | Inte          {$1}

Inte :
    number          {LiteralInteger () $1}


{

data Expression n =
    LiteralTrue n
    | LiteralFalse n
    | Inte n
        deriving (Eq, Show)

data Inte n =
    LiteralInteger n Integer
        deriving (Eq, Show)

....

巨大なエラー メッセージが表示されます。ですので、ご理解いただけると大変助かります。

前もって感謝します

4

2 に答える 2

2

データコンストラクターと型コンストラクターを混同しているようです。Inteinは、以下で定義するデータ型Expressionと同じ名前(および他の方法では関連しない)のデータコンストラクターです。Inte

あなたは次のようなものを持っている必要があります

data Expression n =
    LiteralTrue n
    | LiteralFalse n
    | LiteralInt (Inte n)

コードを適切に変更します(必要に応じて追加LiteralIntします)。

于 2012-10-07T20:36:37.053 に答える
0

わかりました、これはそれが行く方法です:

...
LiteralExpr :
    true            {LiteralTrue ()}
    | false         {LiteralFalse ()}
    | Inte          {LiteralInt $1}

Inte :
    number          {LiteralInteger () $1}
...

...
data Expression n =
    LiteralTrue n
    | LiteralFalse n
    | LiteralInt (Inte n)
        deriving (Eq, Show)

data Inte n =
    LiteralInteger n Integer
        deriving (Eq, Show)
...
于 2012-10-08T08:15:32.180 に答える