2013-05-12 89 views
2

我的程序中有令牌数据类型。它看起来像这样:向haskell类型添加其他信息

data Token 
    = StringToken Strin 
    | NumberToken Integer 
    | IfToken 
    | ElseToken 
    ... -- lots of tokens here 

我在我的解析器中使用这种数据类型蚂蚁它工作正常。但是现在我想为令牌附加一些额外的信息(源位置信息)。所以,我可以改变我的数据类型声明和使用记录:

data Token 
    = StringToken {value :: String, srcLoc :: SourceLocation} 
    | NumberToken {value :: String, srcLoc :: SourceLocation} 
    | IfToken {srcLoc :: SourceLocation} 
    | ElseToken {srcLoc :: SourceLocation} 
    ... -- lots of tokens here 

但是这种解决方案似乎并不十分实用,美观到我。那么这个问题有更好的解决方案吗? 谢谢。

+0

http://stackoverflow.com/questions/16204177/how-should-i-represent-an-ast-annotated-with-additional-information – Arjan 2013-05-12 15:04:02

+0

@Arjan谢谢,它对我很有用。 – sergeyz 2013-05-12 19:14:22

回答

8

是:

data TokenLoc = TokenLoc {tok::Token , srcLoc::SourceLocation} 

它保存令牌和位置在一起,但干净地保持它们分开,避免重复。