使用parsec时避免重复lexing

时间:2016-07-25 16:01:07

标签: haskell parsec

Parsec文档中有一个使用makeTokenParser构建词法分析器的示例:

module Main where

 import Text.Parsec
 import qualified Text.Parsec.Token as P
 import Text.Parsec.Language (haskellDef)

 -- The parser
 ...

 expr  =   parens expr
       <|> identifier
       <|> ...


 -- The lexer
 lexer       = P.makeTokenParser haskellDef    

 parens      = P.parens lexer
 braces      = P.braces lexer
 identifier  = P.identifier lexer
 reserved    = P.reserved lexer
 ...

在&#34;词法分析者&#34;阻止,每个P.*都应用于词法分析器,以便人们可以避免在&#34;解析器&#34;块。然而,为每个令牌重复这一点仍然是乏味的。有没有办法避免重复?我想在#34;解析器&#34;中隐含地应用词法分析器,但我却迷失了。

1 个答案:

答案 0 :(得分:3)

Haskell中有一般syntax for pattern matching on records(我开始注意到所有P.parensP.braces等都是记录投影功能 - 你可以通过查看{ {3}}。)。你可以在这里使用

P.TokenParser { P.parens      = parens
              , P.braces      = braces
              , P.identifier  = identifier
              , P.reserved    = reserved
              } = P.makeTokenParser haskellDef 

修改

正如ErikR指出的那样,你不仅仅想要一些解析器,但是你希望所有29个GenTokenParser字段都进入全局范围,你可以启用RecordWildCards扩展程序,然后编写

 P.TokenParser {..} = P.makeTokenParser haskellDef