問題タブ [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.
scala - parboiled2 内でパーサーを実行する
parboiled2 のドキュメントでは、結果を得るために次のことが言及されています。
https://github.com/sirthias/parboiled2#access-to-parser-results
ただし、そのアプローチに思われることを試みると、コンパイルエラーが発生します。
パーサーの概要は次のとおりです。
それを実行しようとするコード
ただし、「実行」は受け入れられません。
scala - Seq[Any] をケース クラスに分割する賢い方法
セクションがあり、各セクションに多数のレコードがある独自のファイル形式を解析してきました。セクションは任意の順序にすることができ、レコードは任意の順序にすることができます。順序は重要ではありません。セクションを複製するべきではありませんが、それを保証することはできません。
私は parboiled2 を使用して、次のような形式を使用して AST を生成しています。
すべてのセクションがケース クラスを生成する場所。それらは何からも継承しません。Seq[Any]
これらのセクション ケース クラスにはSeq[T]
、セクション タイプに固有のレコードも含まれています。
Seq[Any]
を に変換したい
誰かがそのための巧妙で読みやすいテクニックを持っていますか、それとも変更可能なコレクションをいくつか作成し、一致する foreach を使用する必要がありますか?
vars を使用して foreach に戻ると、Scala の魔法が足りないようにいつも感じます。
EDIT 1:共通の基本クラスを拡張する必要があることが提起されました。それは可能です。match
しかし、タイプを識別するためにまだ使用する必要がある場合、ソリューションについて何が変わるのかわかりません。さまざまなケース クラス タイプを分離したいと考えていますB
。C
E
F
Seq[B]
Seq[C]
Seq[E]
Seq[F]
EDIT 2: 折りたたみソリューション
編集 3: 網羅性
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 つのアプローチが見られます。
- 既存の
CommandParser
ものはそのままにして、コマンド構文順列ごとにコマンド固有のパーサーを作成します - 既存の書き込みコマンド固有の構文中立パーサーを各コマンドに残して、全面的に使用される限り、任意の構文を使用できるようにします (ただし、これを行うにはどうすればよいでしょうか?)
CommandParser
per 構文を記述します。
CurrentCommandParser
は、ほとんどが他のオープン ソースから「着想を得た」ものです。
だから私はおそらく私が持っているものを拡張するCommandParser
か、単にタックする必要があると考えていました