我正在使用 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
之外的另一个函数)?或者处理这种情况的正确方法是什么?