問題タブ [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 - 文字列にその文字を含めることができる場合、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 つのオプションはスペースまでキャプチャしてから文字列を個別に解析することですが、メイン パーサー内で実行することを望んでいました。
scala - Parboiled2: AST からのソース テキスト内の位置への参照
私は DSL を書いており、同時に parboiled2 を学んでいます。AST が構築されたら、いくつかのセマンティック チェックを実行し、エラーがある場合は、ソース テキスト内の問題のある位置を参照するエラー メッセージを出力したいと考えています。
私は次のようなことを書いていますが、これまでのところうまくいきます:
より良い、またはより簡単な方法はありますか?
shapeless - Parboiled2 の「~」コンビネータを理解する
parboiled2セクションを見ると、次のようになりRule Combinators and Modifiers
ます。
a
、b
、の図がわかりませんa ~ b
。
これまでのところ、ドキュメントは簡単であることがわかりました。しかし、私はここで少し迷っています。
各ブロックについて教えてください。
scala - Parboiled2 パーサーの例
私はparboiled2からこの例を試してみようとしています:
MyParser
次に、の入力で新規作成します"foo"
。
それでも戻り値はnull
です。
f
この単純なルールを REPL から実行するにはどうすればよいですか?
scala - Scala のパス依存型 (パーサー) を使用した純粋な関数型プログラミング?
したがって、Scala パーサーを使用する場合は次のようになります。
Parser
はパス依存型であるため、このコードをリファクタリングbars
してコンストラクターから渡すことはできません。parserFromString
私の使用例では、実際に構造が O(N!) になるMyParser
ような方法で を作成することに注意してください。MyParser
N = foos.size
だから今、bars
別の経由でに追加したいとしfoo
ます。FPの方法はbars
、コンストラクターに含めるようにリファクタリングしてから、のようなものを定義することですdef +(foo: String): MyParser = copy(bars = bars :+ parserFromString(foo)
が、前述のように、最初から再作成する必要はありません。
私の解決策は、bars
aを作成しprivate var
、それをUnit
methodupdate
で変更することです。つまり、def update(foo: String): Unit = bars +:= parserFromString(foo)
私の最初の質問は非常に単純です。ミューテーションを使用する必要がありますか?
2 番目の質問: Parboiled2 はこれに悩まされていますか? それらはパス依存型を使用していますか (一見そうは見えません)、そうであれば、なぜ Scala パーサーはパス依存型を使用するのでしょうか?
parboiled2 がパス依存型に悩まされていない場合、これだけでも使用する理由になります!
なぜパラメーターから s を作成する必要があるのか 疑問に思っている人がいれば、Parser
それは、ユーザーがマクロを定義し、それらのマクロを他のマクロの定義に使用できる言語を実装しているためです。いいえ、誰かが私にデザインを変更するように言う前に、私はできません。また、後でマルチスレッドが必要になるため、可変性は本当に望んでいません。
scala - parboiled2 不正なルール構成
cron パーサーを書いているのですが、コンパイラが不正なルール構成を訴え、
パーサーの何が問題になっていますか?