問題タブ [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 に答える
395 参照

scala - 文字列にその文字を含めることができる場合、parboled2 の文字で終わる文字列

私は、parboiled2 パーサーを作成する際に厄介な問題に遭遇しました。つまり、末尾が文字でマークされた文字列である行の一部と一致させる必要があるということです:。文字列に文字を含めることができることを除けば、これは簡単:です。

現時点では、文字列をコロンで終わる文字列のグループとして扱い、それらを連結するこれがありますが、これは、末尾が文字列自体の一部ではないため:、望ましくない末尾を消費します。:

ここのどこかで使用する必要があるように感じますが、インタースティシャル文字&(":")を一致させながらそれを処理するのに苦労しています.:

成功した一致の例 (長い文字列の一部として):

  • localhost:->localhost
  • 1:::->1::
  • :::->::

不一致:

  • :

「あなたにはできない」ということでも、どんな提案でも大歓迎です。


これのコンテキストはbind、HAProxy 構成ファイルの設定を解析することです。次の (簡略化された) ケース クラスが与えられた場合の有効な文字列の例を次に示します。

  • bind :80->Bind(Endpoint(None, Some(80)), Seq())
  • bind localhost:80->Bind(Endpoint(Some("localhost"), Some(80)), Seq())
  • bind localhost->Bind(Endpoint(Some("localhost"), None), Seq())
  • bind :80 param1->Bind(Endpoint(None, Some(80)), Seq("param1")))

言い換えれば、文字列がある場合、それ:はポートがあるという指標であるため、最終的な前に終了する必要があります。ルールは次のendpointようになります。

最終的に、エンドポイントの一致可能な文字列はスペースまたは行末で終了するため、1 つのオプションはスペースまでキャプチャしてから文字列を個別に解析することですが、メイン パーサー内で実行することを望んでいました。

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

scala - Parboiled2: AST からのソース テキスト内の位置への参照

私は DSL を書いており、同時に parboiled2 を学んでいます。AST が構築されたら、いくつかのセマンティック チェックを実行し、エラーがある場合は、ソース テキスト内の問題のある位置を参照するエラー メッセージを出力したいと考えています。

私は次のようなことを書いていますが、これまでのところうまくいきます:

より良い、またはより簡単な方法はありますか?

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

shapeless - Parboiled2 の「~」コンビネータを理解する

parboiled2セクションを見ると、次のようになりRule Combinators and Modifiersます。

ここに画像の説明を入力

ab、の図がわかりませんa ~ b

これまでのところ、ドキュメントは簡単であることがわかりました。しかし、はここで少し迷っています。

各ブロックについて教えてください。

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

scala - Parboiled2 パーサーの例

私はparboiled2からこの例を試してみようとしています:

MyParser次に、の入力で新規作成します"foo"

それでも戻り値はnullです。

f この単純なルールを REPL から実行するにはどうすればよいですか?

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

scala - Scala のパス依存型 (パーサー) を使用した純粋な関数型プログラミング?

したがって、Scala パーサーを使用する場合は次のようになります。

Parserはパス依存型であるため、このコードをリファクタリングbarsしてコンストラクターから渡すことはできません。parserFromString私の使用例では、実際に構造が O(N!) になるMyParserような方法で を作成することに注意してください。MyParserN = foos.size

だから今、bars別の経由でに追加したいとしfooます。FPの方法はbars、コンストラクターに含めるようにリファクタリングしてから、のようなものを定義することですdef +(foo: String): MyParser = copy(bars = bars :+ parserFromString(foo)が、前述のように、最初から再作成する必要はありません。

私の解決策は、barsaを作成しprivate var、それをUnitmethodupdateで変更することです。つまり、def update(foo: String): Unit = bars +:= parserFromString(foo)

私の最初の質問は非常に単純です。ミューテーションを使用する必要がありますか?

2 番目の質問: Parboiled2 はこれに悩まされていますか? それらはパス依存型を使用していますか (一見そうは見えません)、そうであれば、なぜ Scala パーサーはパス依存型を使用するのでしょうか?

parboiled2 がパス依存型に悩まされていない場合、これだけでも使用する理由になります!

なぜパラメーターから s を作成する必要があるのか​​ 疑問に思っている人がいれば、Parserそれは、ユーザーがマクロを定義し、それらのマクロを他のマクロの定義に使用できる言語を実装しているためです。いいえ、誰かが私にデザインを変更するように言う前に、私はできません。また、後でマルチスレッドが必要になるため、可変性は本当に望んでいません。

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

scala - parboiled2 不正なルール構成

cron パーサーを書いているのですが、コンパイラが不正なルール構成を訴え、

パーサーの何が問題になっていますか?