問題タブ [parser-combinators]
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 - Scala、ツリー構造化データのパーサーコンビネーター
パーサーを使用して、複数行にまたがるレコードを解析するにはどうすればよいですか?ツリーデータを解析する必要があります(そして最終的にはツリーデータ構造に変換します)。以下のコードで追跡が困難な解析エラーが発生していますが、これがScalaパーサーを使用した最善のアプローチであるかどうかは明確ではありません。問題は、既存のコードをデバッグすることではなく、問題解決のアプローチに関するものです。
EBNFっぽい文法は次のとおりです。
文法を実装してテストする試み:
parsing - Scala パーサー - メッセージの長さ
私は Scala の Parser ライブラリをいじっています。長さが指定され、その後にその長さのメッセージが続く形式のパーサーを作成しようとしています。例えば:
コンビネータを使用してこれを行う方法がわかりません。私の心は最初に行きます:
しかし、明らかに体は長さに依存し、それを行う方法がわかりません:p
代わりに、メッセージ パーサーを 1 つのパーサー (パーサーの組み合わせではなく) として定義するだけで済みます。
とにかく、私はスカラ初心者です。これは素晴らしいと思います:)
parsing - Scalaパーサーコンビネーター、優先順位が原因でパーサーが失敗する
プログラミング言語Iconのインタプリタを書こうとしています。このプロセスのステップの1つは、Iconのパーサーを作成することです。これは、次の方法で実行しました。
ただし、次の式を解析しようとすると、いくつかの問題が発生しました。
このエラーが発生します:
一方、構文解析
うまく動作します。orexpパーサーをfromtoパーサーの上のexpグループに移動すると、最初の式は正常に機能します。ただし、これはIconによって指定されたルールに準拠しておらず、根本的な問題を解決しません。
誰かが解決策のアイデアを持っていますか?Scalaのドキュメントによると、packratパーサーと通常のパーサーを混在させても問題ありません。
scala - REST サービスのルーティングと処理のためのビジネス ルールを実装するための DSL
Combinator parsers
( http://debasishg.blogspot.com/2008/04/external-dsls-made-easy-with-scala.html ) が、REST サービスのルーティング規則を処理する設計で機能することを願っています。 Scalatra
( http://tutorialbin.com/tutorials/80408/infoq-scalatra-a-sinatra-like-web-framework-for-scala )で実装されています。
この REST サービスはプロキシとして機能し、外部アプリケーションがファイアウォール内のサービスにアクセスできるようにします。これは、各 REST サービスのビジネス要件に合わせてカスタマイズできる追加のセキュリティ レイヤーがあるためです。
したがって、ある人が自分のクラス スケジュールにアクセスしたい場合は、誰かの成績証明書を見たい場合よりもセキュリティが低くなります。
実際に情報を取得するための場所、情報を返す方法、および必要なセキュリティについてのルールを DSL で示してください。
しかし、最初の問題は、DSL に基づいて REST サービスのルーティング ルールを動的に変更する方法です。新しいルールを追加するために大量の再コンパイルを必要とせず、適切なルールを記述するだけのフレームワークを作成しようとしているからです。スクリプトを作成し、そのまま処理させます。
では、Scala で Combinator パーサーを使用して DSL を実装し、JAX-RS ( http://download.oracle.com/javaee/6/tutorial/doc/giepu.html ) が動的にルーティングを変更できるようにすることはできますか?
アップデート:
私はまだ言語を設計していませんが、これは私がやろうとしていることです:
これらは、トランスクリプトのリクエストのルールがファイアウォール内などの別のサイトに送信され、データが暗号化されて返される場合に考えられる 2 つのアイデアです。
2 つ目は、SOAP と 2 つの REST 要求の結果が結合されるという点でより複雑になります。これを結合する方法について追加のコマンドが必要になりますが、アイデアは、これらすべてを解析可能なファイルに入れることです。急いで。
Groovy を使用した場合、ルーティング用にいくつかの新しいクラスが生成され、パフォーマンス ヒットが解消される可能性がありますが、パフォーマンス ヒットが発生したとしても、Scala を使用するのが最善の策だと思います。
私の希望は、OOP や関数型言語をまったく知らない人でも新しいルーティング ルールを記述できるように、より保守しやすいフレームワークを作成することですが、仕様はSpecs
( http://code.google.com/p /specs/ ) 機能面で、要件が定期的にテストされていることを確認できます。
更新 2:
デザインに取り組み始めると、いくつかのオプションを直感的に理解できますが、その理由はわかりません。今日、Groovy がこれに対するより良い修正である理由は、メタプログラミング ( http://www.justinspradlin.com/programming/groovy-metaprogramming-adding-behavior- dynamic/ )、その後、Scala または Groovy を使用して、生成されたルーティングを動的に使用できます。クラスがまだ存在しない場合、Scala にクラスを生成させる方法がわかりません。
Groovy では、他のいくつかの言語と同様に、ここ ( http://langexplr.blogspot.com/2008/02/handling-call-to-missing-method-in.html ) に示すように、メソッドが欠落している場合、動的に実行できますメソッドを生成すると、それ以降存在するため、1回欠落します。
これを機能させるには、Groovy と Java を組み合わせる必要があるように思われますが、REST サービスのルーティングのために、一部のコードが Scala にあり、一部が Java にあるという結果になる可能性があります。
scala - パーサーコンビネーターで条件チェックを行うにはどうすればよいですか
私は単純な html テンプレート エンジンを (楽しみのために) 書こうとしていましたが、このような構造を解析したいと考えています。
A. 通常の行は HTML です
B.行が次で始まる場合、$
それをJavaコード行として表示します
C.${}
複数の行を折り返す場合、その中のすべてのコードは Java コードである必要があります。
D.行がで始まる場合、行$include
に何らかのトリックを実行します(別のテンプレートを呼び出します)
これは の新しいインスタンスを作成し、そのメソッドanotherTemplate
を呼び出しますrender()
$include
E.など、$def
以外の「コマンド」がもっとあるでしょう$val
。
これをパーサーコンビネーターでどのように表現できますか? 事実上、それは条件付きフォークです
1. と 2. の場合、次のような結果が得られました。
Scalate Scamel パーサーから借用した場所upto
(読み始めたばかりで、よくわかりません)
コード行とブロックnot('{')
を区別していました。しかし、これは面倒で、他の「コマンド」には拡張できません。$....
${...}
どうすればこれを行うことができますか?
unit-testing - ScalaLexerのユニットテスト
私はScalaパーサーコンビネーターを使用して書かれたインタープリターに取り組んでいます。私の通訳者は、字句解析と構文解析を2つのフェーズに分けています。レクサーの単体テストを作成して、正しい出力が生成されることを確認したいと思います。
現在、私はヘルパーメソッドメソッドを使用してユニットテストを行っています。これは以下に含まれています。このメソッドは、プログラムのソースコードをパラメーターとして受け取り、トークンオブジェクトのリストを返します。単体テストフレームワーク(ScalaTest)を使用して、結果のトークンのリストに対してパターンマッチングを行うことができます。
現在の方法の問題:
- ユニットテストを支援するためだけに、レクサー内にヘルパーメソッドが必要です
- whileループを使用します
- スキャナーを手動で作成して使用することに頼っています
プログラムのソースコードをトークンのリストに変換するもっと良い方法があるはずです。
私の現在の作業バージョン(少なくとも関連する部分):
parsing - Scala Parser Combinators を使用してコードを変更し、演算子の優先順位を考慮する方法は?
文法のこの部分を考えてみましょう:
新しいルールを作成するためにその一部を書き直す必要がありますか、それとも必要なことを行う方法 (最初のルールと最長のルールの一致の対など|
)|||
が現在不足していますか?
scala - パーサー コンビネーターを使用して等値を一覧表示する
ここからいくつかの Scala CSV 解析コードを取得しました。
Scala パーサー コンビネーターを使用して CSV ファイルを解析する
そして、そのための基本的なテストを作成しようとしました:
そして、これは失敗し、次のメッセージが表示されます:
java.lang.AssertionError: 予想: scala.collection.immutable.$colon$colon だったが: scala.collection.immutable.$colon$colon
何か案は?CSV.parse からの出力は空の List[List[String]] ですが、List(Nil) や ListList[String] などとは異なる hashCode を持っているようです。 CSV.parse("") の出力と同じです。
アップデート:
REPL を使用した場合の失敗は次のとおりです。
scala - Scalaのパーサーコンビネーターのチルダを理解する
私はScalaにかなり慣れていないので、パーサーコンビネーター(パーサーコンビネーターの背後にある魔法、Scalaのドメイン固有言語)について読んでいるときに、次のようなメソッド定義に出くわしました。
(tilde)という名前のメソッドを定義するscala.util.parsing.ParsersのAPIドキュメントを読んでいますが、上記の例での使用法をまだよく理解していません。その例では、(チルダ)はjava.lang.Stringで呼び出されるメソッドであり、そのメソッドがなく、コンパイラーが失敗します。(チルダ)は次のように定義されていることを私は知っています
しかし、これは上記の例でどのように役立ちますか?
誰かがここで何が起こっているのかを理解するためのヒントをくれたら嬉しいです。事前にどうもありがとうございました!
1月