問題タブ [parboiled2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
117 参照

scala - parboiled2 内でパーサーを実行する

parboiled2 のドキュメントでは、結果を得るために次のことが言及されています。

https://github.com/sirthias/parboiled2#access-to-parser-results

ただし、そのアプローチに思われることを試みると、コンパイルエラーが発生します。

パーサーの概要は次のとおりです。

それを実行しようとするコード

ただし、「実行」は受け入れられません。

0 投票する
1 に答える
683 参照

scala - Seq[Any] をケース クラスに分割する賢い方法

セクションがあり、各セクションに多数のレコードがある独自のファイル形式を解析してきました。セクションは任意の順序にすることができ、レコードは任意の順序にすることができます。順序は重要ではありません。セクションを複製するべきではありませんが、それを保証することはできません。

私は parboiled2 を使用して、次のような形式を使用して AST を生成しています。

すべてのセクションがケース クラスを生成する場所。それらは何からも継承しません。Seq[Any]

これらのセクション ケース クラスにはSeq[T]、セクション タイプに固有のレコードも含まれています。

Seq[Any]を に変換したい

誰かがそのための巧妙で読みやすいテクニックを持っていますか、それとも変更可能なコレクションをいくつか作成し、一致する foreach を使用する必要がありますか?

vars を使用して foreach に戻ると、Scala の魔法が足りないようにいつも感じます。

EDIT 1:共通の基本クラスを拡張する必要があることが提起されました。それは可能です。matchしかし、タイプを識別するためにまだ使用する必要がある場合、ソリューションについて何が変わるのかわかりません。さまざまなケース クラス タイプを分離したいと考えていますBCEFSeq[B]Seq[C]Seq[E]Seq[F]

EDIT 2: 折りたたみソリューション

編集 3: 網羅性

0 投票する
0 に答える
36 参照

scala - 複数の構文 (PowerShell スタイル、bash/sh スタイル、Cisco スタイル) を受け入れることができるように、parboiled2 でサブクラス化する方法はありますか?

警告 私は を初めて使用しparboiled2ます。

関連する構文にとらわれない方法で CLI を記述できるようにしたいと考えています。常に同じ形状で、以下のトリプレットになります。

これをさらに進めて、おそらくこれをサブクラス化するか、そのパーサーをサブクラス化するか、または拡張して次の機能を実現したいと思います。

次のいずれかを受け入れます。

  • Create-Dog -Feet 4 -Name Fido -Walks Daily /Home/Dogs
  • create_dog -f 4 --name Fido ~/Dogs
  • Dog.Create Feet=4, Name=Fido, Walks=Daily in /Home/Dogs

例として。ここで詳細を求めているわけではありません。私が求めているのは、最初からこれに取り組む方法です。

少なくとも 2 つまたは 3 つのアプローチが見られます。

  1. 既存のCommandParserものはそのままにして、コマンド構文順列ごとにコマンド固有のパーサーを作成します
  2. 既存の書き込みコマンド固有の構文中立パーサーを各コマンドに残して、全面的に使用される限り、任意の構文を使用できるようにします (ただし、これを行うにはどうすればよいでしょうか?)
  3. CommandParserper 構文を記述します。

CurrentCommandParserは、ほとんどが他のオープン ソースから「着想を得た」ものです。

だから私はおそらく私が持っているものを拡張するCommandParserか、単にタックする必要があると考えていました