発言から始めましょう: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
私はあなたが本当にあなたが望むものに一致するようにこの解決策を微調整する必要があると思うが、それはあなたに良いスタートを切るはずである(私は願っている)。