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;中隐含地应用词法分析器,但我却迷失了。
答案 0 :(得分:3)
Haskell中有一般syntax for pattern matching on records(我开始注意到所有P.parens
,P.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