gpt4 book ai didi

parsing - Haskell - 使用状态与替代方案

转载 作者:行者123 更新时间:2023-12-02 20:31:49 24 4
gpt4 key购买 nike

我的数据类型如下所示:

type Parser a = ExceptT ParseError (State [Token]) a

以及状态操作函数:

consumeToken :: Parser Token
consumeToken = do
toks <- lift get
if null toks
then throwE OutOfTokensError
else
do
lift $ put (tail toks)
return $ head toks

peekToken :: Parser Token
peekToken = do
toks <- lift get
if null toks
then throwE OutOfTokensError
else
do
return $ head toks

我正在尝试使用这些函数来帮助验证语法中的产生式规则:

charList :: Parser CharList
charList =
(return CharListCharacter <*> isToken (Character "<char>") <*> charList)
<|> (return CharListSpace <*> isToken (Space " ") <*> charList)
<|> (return EmptyCharList)

看来 isToken 需要消耗当前 token (使用 consumeToken),以便对 charList 的递归调用然后处理以下内容 token 。然而,这样做意味着替代案例将不会与第一个案例从相同的原因开始。

有没有标准方法来处理这个问题?

最佳答案

根据评论的建议,我重新构建了我的解析器,以利用我的语法是 LL(1) 的事实。这样做意味着我不需要Alternative

这是 charList 函数的最终版本(其中 isToken 使用 consumeToken):

charList :: Parser CharList
charList = do
tok <- peekToken
case tok of Character _ -> return CharListCharacter <*> isToken (Character "<char>") <*> charList
Space _ -> return CharListSpace <*> isToken (Space " ") <*> charList
_ -> return EmptyCharList

关于parsing - Haskell - 使用状态与替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49626131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com