問題タブ [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.

0 投票する
6 に答える
1459 参照

compiler-construction - Scalas/Haskells パーサー コンビネータで十分ですか?

Scalas/Haskells パーサー コンビネーターがプログラミング言語の解析に十分かどうか疑問に思っています。より具体的には、MiniJava 言語です。私は現在、コンパイラの構築を読んでおり、jflex と Java カップを使用するのは非常に面倒なので、代わりにパーサー コンビネータを使用できる/使用する必要があるかどうか疑問に思っています。MiniJava 構文は非常に小さいです。MiniJavas BNF: http://www.cambridge.org/us/features/052182060X/grammar.html

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

parsing - EBNF から Scala パーサー コンビネーターへ

解析したい次の EBNF があります。

そして、これは私が得たものです:

しかし、できればキャスト(asInstanceOf)に頼る必要なしに、より良い方法があるかどうかを知りたいです。

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

scala - Scala パーサーのトークン区切りの問題

以下のコマンドの文法を定義しようとしています。

2 番目のコマンドは、次のようにトークン化する必要があります。

以下に定義する文法でこの入力を実行すると、次のエラー メッセージが表示されます。

私が見る限り、メッセージの単語を照合するパターンは、プロパティのキーと値のペアのキーのパターンとほぼ同じであるため、パーサーはメッセージがどこで終了し、プロパティが開始するかを判断できないため、失敗します。次のように、各プロパティに開始トークンを使用することを主張することで、これを解決できます。

しかし、コマンドをできるだけ自然言語に近づけたいと思います。2 つの質問があります。

エラーメッセージは実際にはどういう意味ですか? また、指定された入力文字列で機能するように既存の文法を変更するにはどうすればよいでしょうか?

0 投票する
4 に答える
3824 参照

scala - Accessing Scala Parser regular expression match data

I wondering if it's possible to get the MatchData generated from the matching regular expression in the grammar below.

One option of course is to perform the match again inside the block, but since the RegexParser has already performed the match I'm hoping that it passes the MatchData to the block, or stores it?

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

parsing - 「|」の戻り型 Scala のパーサー コンビネータで

「Scala のパーサー コンビネーター」に関するバーニー ポープのスライドを読んでいました。彼は、「代替」コンビネータのメソッド シグネチャ タイプを引用しています|

そして、「宿題: 代わりにこのタイプがないのはなぜですか?」と尋ねます。

0 投票する
2 に答える
4905 参照

scala - 行末が重要なパーサーコンビネーターを作成するにはどうすればよいですか?

私は DSL を作成しており、Scala のパーサー コンビネーター ライブラリを使用して DSL を解析しています。DSL は、Ruby に似た単純な構文に従います。ソース ファイルには、次のような一連のブロックを含めることができます。

DSL では、行末はステートメントのターミネーターとして効果的に使用されるため、重要です。

次のような Scala パーサーを作成しました。

行末は重要なwhiteSpaceので、(新しい行を空白として扱って無視するのではなく) スペースとタブのみを空白として扱うようにオーバーライドしました。

の「終了」ステートメントを除いて、これは機能しcommandBlockます。私のソース ファイルには末尾の改行が含まれているため、パーサーはキーワードendの後に​​改行を期待していたのに、改行を取得したと不平を言います。end

そこでcommandBlock、 の定義を次のように変更しました。

(つまり、「end」の後にオプションの新しい行を追加しました)。

しかし、ソース ファイルを解析すると、次のエラーが表示されます。

これは、末尾の改行を吸い込んだ後、パーサーが無効であると考える空の文字列に遭遇したためだと思いますが、なぜこれを行っているのかわかりません

これを修正する方法に関するヒントはありますか?Scala のパーサー コンビネーター ライブラリから間違ったパーサーを拡張する可能性があるため、重要な改行文字を含む言語定義を作成する方法についての提案も歓迎します。

0 投票する
3 に答える
1332 参照

scala - パーサーコンビネーターが終了しない - 何が起こっているのかをログに記録する方法は?

私はパーサー コンビネータを試していますが、無限再帰のように見えることがよくあります。これが私が最初に遭遇したものです:

何が起こっているのかを印刷するにはどうすればよいですか? そして、なぜこれは終わらないのですか?

0 投票する
2 に答える
4753 参照

parsing - Scala パーサー コンビネーターは Haskell の Parsec と比べてどうですか?

Haskell パーサー コンビネータ (Parsec 内) が文脈依存文法を解析できることを読みました。これは Scala パーサー コンビネーターにも当てはまりますか? もしそうなら、これは "into" (別名 ">>") 関数の目的ですか?

Scala のパーサー コンビネータの実装と Haskell の実装の長所/短所は何ですか? それらは同じクラスの文法を受け入れますか? エラーメッセージを生成したり、他のさまざまな便利なことをしたりするのは簡単ですか?

packrat の構文解析 (Scala 2.8 で導入) は、この状況にどのように当てはまりますか?

ある言語の実装からの異なる演算子/関数/DSL-sugarが他の言語の実装にどのようにマッピングされるかを示すWebページまたはその他のリソースはありますか?

0 投票する
2 に答える
2499 参照

scala - 何が問題なのですか:「値パーサーはパッケージ scala.util.parsing.combinator のメンバーではありません」?

「値パーサーはパッケージ scala.util.parsing.combinator のメンバーではありません」という、上記の奇妙なエラー メッセージが表示されます。

Cパーサーを段階的に作成することにより、パーサーコンビネーターを学習しようとしています。私はトークンで始めたので、クラスがあります:

これは私ができる限り簡単です。

以下のコードは問題なく動作しますが、コメント行のコメントを外すと、上記のエラー メッセージが表示されます。

セットアップに問題がある場合は、intellij の scala-plugin 経由で scala 2.7.6 を使用しています。誰でもこれに光を当てることができますか?メッセージが間違っています。Parsersのメンバーですscala.util.parsing.combinator

- - ファローアップ

この人http://www.scala-lang.org/node/5475も同じ問題を抱えているようですが、彼の答えがわかりません。誰でも説明できますか?

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

scala - scala StdLexicalで改行をレクシングしますか?

C のような言語を lex (その後、解析) しようとしています。C では、改行が重要なプリプロセッサ ディレクティブがあり、実際のコードでは改行が単なる空白です。

これを行う 1 つの方法は、初期の C コンパイラのような 2 パス プロセスを実行することです。# ディレクティブ用に別のプリプロセッサを用意し、その出力を lex します。

しかし、単一のレクサーでそれが可能かどうか疑問に思いました。StdLexicalscala パーサーとコンビネーターのコードを書くことにはかなり満足していますが、 が空白をどのように処理するかについてはよくわかりません。

#include改行を使用して行をレックスし、改行を無視していくつかの簡単なコードを書くことができると言う単純なサンプルコードを誰かが書くことができますか? それとも、これは不可能であり、2 パスアプローチを使用する方がよいでしょうか?