将字符串作为token用Parsec解析

问题描述 投票:0回答:0

我正在使用 Parsec 库来解析字符串。我遇到的问题是无法区分某些标记,因为它们是具有相同前缀的单词。简化整个语法(在我的例子中它不是常规语法),假设我们有以下内容:

T0 := <empty> | tag0 T1
T1 := tag1 | tag1 T1

所以我可能有像“tag0tag1tag1”或“tag0tag1tag0tag1”等字符串,基本上我们有一个“tag0”字符串,后跟任意(非零)数量的“tag1”字符串,所有这些也可以重复任何数量的时间。

所以我尝试的是这样的:

wrongParser :: Parser String
wrongParser = do
    string "tag0"
    many $ string "tag1"
    return "Ok"

并测试了

ghci> parse wrongParser "Error" "tag0tag1tag1tag0tag1"
Left "Error" (line 1, column 13):
unexpected "0"
expecting "tag1"

所以这里似乎发生的是解析器从“tag0”读取“tag”,但它期待“tag1”(因为仍在读取“tag1”的

many
)。

有没有办法让解析器将标签字符串作为一个整体,这样它就不会失败,而是假设所有的标签 1 都已经被读取并没有错误地停止(可能是

string
之外的另一个函数)?或者处理这种情况的正确方法是什么?

haskell parsec
© www.soinside.com 2019 - 2024. All rights reserved.