1

ハッシュタグのパーサーを書きたいと思います。opa ブログの構文解析に関するブログ エントリを読んでいますが、再帰パーサーやリストの構築についてはあまり取り上げていませんでした。

ハッシュタグは、一部のソーシャル ネットワーク (Twitter、Diaspora*) で投稿にタグを付けるために使用されます。それらは、ハッシュ記号 ( #) と、「興味深い」や「面白い」などの英数字の文字列で構成されます。ハッシュタグを使用した投稿の一例:

Oh #Opa, you're so #lovely! (Are you a relative of #Haskell?)

という結果になる解析["Opa", "lovely", "Haskell"]

私はそれをやろうとしましたが、それは私が望むものではありません。(ハッシュタグを 1 つだけ解析するか、無限ループで失敗するか、理解できない入力があったために失敗するかのいずれかです...) さらに、これを実装するHaskell バージョンを次に示します。

4

2 に答える 2

2

発言から始めましょう: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

私はあなたが本当にあなたが望むものに一致するようにこの解決策を微調整する必要があると思うが、それはあなたに良いスタートを切るはずである(私は願っている)。

于 2011-11-24T12:15:56.343 に答える
0

The following work, just using plain parsers

hashtag  = parser "#" tag=Rule.alphanum_string -> tag
list_tag = parser
         | l=((!"#" .)* hashtag -> hashtag)* .* -> l

parsetag(s) = Parser.parse(list_tag, s)

do println("{parsetag("")}")
do println("{parsetag("aaabbb")}")
do println("{parsetag(" #tag1 #tag2")}")
do println("{parsetag("#tag1 #tag2 ")}")
do println("{parsetag("#tag1#tag2 ")}")
于 2011-12-23T19:46:25.007 に答える