我在理解解析器生成器系统的错误消息方面有一些问题,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)
....我将收到一条巨大的错误消息。因此,如果你能帮助我理解它,那就太好了。
提前感谢
发布于 2012-10-08 04:36:37
看起来你混淆了数据构造函数和类型构造函数。Expression中的Inte是一个数据构造函数,它恰好与您在下面定义的Inte数据类型具有相同的名称(并且在其他方面与之无关)。
你应该有类似这样的东西
data Expression n =
LiteralTrue n
| LiteralFalse n
| LiteralInt (Inte n)并适当修改您的代码(在需要的地方添加LiteralInt )。
发布于 2012-10-08 16:15:32
好的,事情是这样的:
...
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)
...https://stackoverflow.com/questions/12772583
复制相似问题