Parsing 如何使用Parsec(Haskell)将值插入到基于键标记的字符串中?

Parsing 如何使用Parsec(Haskell)将值插入到基于键标记的字符串中?,parsing,haskell,parsec,Parsing,Haskell,Parsec,我不熟悉语法分析,有一个看似简单的问题: 我有一个由正常文本的块s和键s组成的长字符串,它们的编码类似于 数据合并a=块a |a键 派生(显示) 键::分析器(合并字符串) 键=键之间的键(字符串“”)(多1个字母) 块::分析器(合并字符串) chunk=chunk many1 anyChar 散文=许多1$关键块 “嗨!你喜欢吗?” --返回: --[Chunk“嗨!你喜欢吗?”] --我想: --[区块“嗨”,键“x”,区块“!”,…] 我想用值替换这些键,但如果我能将字符串解析为我的标

我不熟悉语法分析,有一个看似简单的问题:

我有一个由正常文本的
s和
s组成的长字符串,它们的编码类似于

数据合并a=块a
|a键
派生(显示)
键::分析器(合并字符串)
键=键之间的键(字符串“”)(多1个字母)
块::分析器(合并字符串)
chunk=chunk many1 anyChar
散文=许多1$关键块
“嗨!你喜欢吗?”
--返回:
--[Chunk“嗨!你喜欢吗?”]
--我想:
--[区块“嗨”,键“x”,区块“!”,…]
我想用值替换这些键,但如果我能将字符串解析为我的标记,即
string->[Merge]
,我就可以解决这个问题

我已经深入到了词法分析/解析的无限深度,虽然我希望最终能了解所有内容,但现在有什么关于解决这个问题的指导吗


这是我尝试的最简单的实例,尽管我尝试过对数据进行单独的传递,包括单独的词法分析/解析步骤,并且我想使用
parsec
,而不是更具体的插值库。

您可以使用
notFollowedBy
来表示希望块包含 字符,只要它不是键
NotFollowBy
不使用 输入,因此
散文
仍将继续将键作为自己的项再次解析

chunk = Chunk <$> many1 (notFollowedBy key >> anyChar)
是一个用于使用解析器进行搜索和替换的库。这个 搜索和替换功能不可用

import Replace.Megaparsec
导入文本.Megaparsec
导入Text.Megaparsec.Char
导入数据.Char
key=between(string“”)(多字母字符)::Parsec Void string
编辑器k=“键”+(fmap toUpper k)
streamEdit键编辑器“嗨!你喜欢吗?”
“嗨,钥匙X!你喜欢钥匙Y吗?”
您还可以使用 parser combinator,返回与
[Merge]

当您的解析器查找
块时,它将清除所有剩余的字符,因为它的规则是
many1 anyChar
。您需要更改规则以禁止序列
,您必须确定这是一个错误,还是您想回溯,并将其视为另一个
@pat我理解
多个anyChar
太贪婪了,但是,如果我错了,请纠正我,
Chunk
需要对
键的语法概念进行编码(即停止
@Josh.F这取决于您想要的语义,
“有效!嘿,我还知道,对于更复杂的解析,向前看或向后看的事情效率很低,通过多次传递就可以避免。我尝试了多次传递方法,但后来我还没有弄清楚如何在令牌上使用Parsec,而不是在字符/字符串上使用Parsec。你能给我指出正确的方向吗?”?
chunk = Chunk <$> many1 (notFollowedBy key >> anyChar)
chunk = Chunk <$> many1 (notFollowedBy (string "<<") >> anyChar)