首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >特里菲塔的习俗州

特里菲塔的习俗州
EN

Stack Overflow用户
提问于 2013-09-14 21:30:21
回答 1查看 424关注 0票数 6

我使用三联解析器组合器库,我的解析器输出AST数据类型的实例。我希望每个实例都有唯一的ID (这是简单的Int)。

在Parsec中,我将创建自定义状态,并在私处时增加ID。我们怎么才能在Trifecta做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-15 12:00:45

您可以使用Parser monad转换器增强StateT monad,以获得所需的内容。这与库的其他部分集成得很好,因为大多数组合器使用的是类型类而不是具体类型(这意味着代码不必做太多提升才能工作)。这是一个很好的例子。它用由空格分隔的标识符和符号来解析语法。每个标识符都给出一个唯一的数字。

代码语言:javascript
复制
module Main where
import Text.Trifecta
import Control.Monad.State
import Control.Applicative
import Data.Monoid

data Identifier = Identifier String Int deriving (Show)

identifier :: StateT Int Parser Identifier
identifier = do
  name <- some letter
  newId <- get
  modify (+1)
  return $ Identifier name newId

symbolToken :: Parser Char
symbolToken = oneOf "+-*/"

data Token = IdentifierToken Identifier | SymbolToken Char deriving (Show)

singleToken :: StateT Int Parser Token
singleToken = try (IdentifierToken <$> identifier) <|> (SymbolToken <$> lift symbolToken)

parseTokens :: StateT Int Parser [Token]
parseTokens = singleToken `sepBy1` spaces

testParse :: String -> Result [Token]
testParse = parseString (evalStateT parseTokens 0) mempty 

test1 :: Result [Token]
test1 = testParse "these are identifiers and + some / symbols -"

test1的结果是:

代码语言:javascript
复制
Success [IdentifierToken (Identifier "these" 0)
,IdentifierToken (Identifier "are" 1)
,IdentifierToken (Identifier "identifiers" 2)
,IdentifierToken (Identifier "and" 3)
,SymbolToken '+',IdentifierToken (Identifier "some" 4)
,SymbolToken '/',IdentifierToken (Identifier "symbols" 5),SymbolToken '-']
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18806586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档