首先说一句:通过用 Haskell 术语提出问题,您实际上是在寻找了解 Opa和Haskell 的人,因此减少了找到回答问题的人的机会;)。好的,我半开玩笑地说,因为您的评论有很大帮助,但我仍然希望看到用简单的英语表达的问题。
我认为保持 Haskell 结构的解决方案是这样的:
parse_tags =
hashtag = parser "#" tag=Rule.alphanum_string -> tag
notag = parser (!"#" .)* -> void
Rule.parse_list_sep(true, hashtag, notag)
可能主要的“技巧”是使用该Rule.parse_list_sep
函数来解析列表。建议你看一下模块中一些功能的实现,以Rule
获得灵感并了解更多关于在 Opa 中解析的知识。
当然我建议测试这个函数,例如使用以下代码:
_ =
test(s) =
res =
match Parser.try_parse(parse_tags, s) with
| {none} -> "FAILURE"
| {some=tags} -> "{tags}"
println("Parsing '{s}' -> {res}")
do test("#123 #test #this-is-not-a-single-tag, #lastone")
do test("#how#about#this?")
void
这将给出以下输出:
Parsing '#123 #test #this-is-not-a-single-tag, #lastone' -> [123, test, this, lastone]
Parsing '#how#about#this?' -> FAILURE
我怀疑您需要微调此解决方案以真正符合您的要求,但它应该会给您一个良好的开端(我希望)。