問題タブ [jparsec]
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.
java - Jparsec - 単純な数値の解析
簡単なコードを次に示します。
これは、数値、つまり 234234234 を出力することになっています。代わりに、次のように出力します。
それで、私は何が欠けていますか?
java - 単純な文字列式の解析における JParsec のバグ
Java アプリケーション用のパーサーが必要なので、JParsec ライブラリーを発見し、その Web サイトで簡単な電卓の文法を使ったチュートリアルを実行しました。ライブラリを使用して計画したことを実行できるように思われるため、サンプル電卓から非常に単純な識別子を文字列として解析するように 10 進数リテラルの解析を変更するプロトタイプを作成し始めました。私が今やりたい唯一の操作は、文字列を連結するための「+」ですが、エラーメッセージが表示され続けます。これが私のコードです:
そして、ここに私が得ているエラーがあります:
私が間違っていることは何か分かりますか?どんな助けでも大歓迎です!
java - jparsec の混乱
jparsec を使用して、かなり単純な文法を定義および利用しようとしていますが、その方法について完全に混乱しています。問題空間に対する私の不十分な理解なのか、それとも jparsec のまばらで有益でないドキュメントなのか、現時点ではわかりません。または両方。
私はこのようなグラマーを持っています:
、、、、、、などAND
の演算子OR
をサポートしていることがわかります。また、優先順位を指定するために、任意にネストされた括弧もサポートしています。NOT
IN
=
<>
トークン化についてはかなり進んだと思います。ここに私が持っているものがあります:
test_tokenizer
パスなので、問題なく動作していると思います。
これで、構文を表す型階層が既にできました。たとえば、、、、、などNode
とBinaryNode
呼ばFieldNode
れるクラスがLogicalAndNode
あります。ConstantNode
そして、私がやろうとしているのParser
は、トークンを取得して を吐き出す を作成することNode
です。そして、これは私が立ち往生し続ける場所です。
私は、次のような非常に単純なものから始めようと考えました。
私はこれを行うことができると思いました:
しかし、それは私にコンパイルエラーを与えます:
したがって、ジェネリックがどこかで壊れているように見えますが、これをどこでどのように修正すればよいかわかりません。私はこれについて正しい方法で行っているかどうかさえ確信が持てません。誰でも私を啓発できますか?
java - JParsec が簡単なテストで失敗する
JParsec 2.0.1 で動作する最も単純なパーサーを取得しようとしていますが、うまくいきません。次の AST クラスがあります。
そして、次のテスト コード:
レクサーはトークンへの文字列入力を正常に解析していますが、パーサーは JParsec 例外のためにそれらのトークンを消費できません。私はこのコードを何度も研究してきましたが、これは jparsec のバグであるか、明らかな何かを誤解しているとしか思えません。
ここで私が間違っていることを誰かに教えてもらえますか?
更新:元の問題は再帰参照によるものだと思います。私CONSTANT_PARSER
は を使用してCONSTANT_LEXER
おり、後で を呼び出しますCONSTANT_PARSER.from(CONSTANT_LEXER...)
。my を次のように変更するCONSTANT_PARSER
と、テストに合格しました。
ただし、これはまだ完全にはクリックされていません。これを行うためのより良い方法があると思うので、まだアイデアに非常に興味があります.
java - JParsec を使用して括弧内のテキストを解析する
構文を使用する DSL のパーサーを作成しています(nodeHead: nodeBody)
。問題は、nodeBody
場合によっては括弧が含まれる可能性があることです。JParsecのbetween
オペレーターは適切な解決策であるはずですが、次のコードは失敗します。
ANY_CHAR
に変更しても失敗しないのでIDENTIFIER
、ここでの問題は、タプルの 2 番目のパーサーが貪欲すぎることだと思います。あるいは、本体を適用する前に JParsec にパーサー間を適用させることはできますか?
どんなアイデアも非常に高く評価されています。
java - JParsec(3) で一致した入力の場所を取得するにはどうすればよいですか?
JParsec3 を使用して DSL を作成しています。解析/リンクは 2 つのフェーズで行われます。
- 言語を中間オブジェクトに解析する
- オブジェクトを実行可能なオブジェクトにリンクおよび変換する
ステージ 1 で作成されたオブジェクトは、まだ解析されていない他のオブジェクトを参照できるため、2 つのパスがあります。ここで、リンケージ エラー メッセージについて、存在しないアイテムを参照しているファイル内の場所にユーザーを送る必要があります。そのためには、中間オブジェクトに場所をアタッチする必要があります。
それ、どうやったら出来るの?
ありがとう!
java - Terminals.tokenizer() が未登録のオペレーター/キーワードをトークン化するのはなぜですか?
私が観察していたいくつかの非常に紛らわしい動作の根本的な原因を発見しました。ここにテストがあります:
これは以下を出力します:
terminals.tokenizer()
「d」は有効なキーワードまたは演算子ではないため、返されたパーサーが何も返さないことを期待していました。
私が気にする理由は、自分のパーサーの優先度を から返される優先度よりも低くしたかったからですterminals.tokenizer()
。
常に一致するため、IDENTIFIER_TOKENIZER
上記は使用されません。TERMINALS.tokenizer()
Terminals.tokenizer()
未登録のオペレーター/キーワードをトークン化するのはなぜですか? そして、どうすればこれを回避できますか?
jparsec - JParsec には「until」コンビネータがありますか?
「until」コンビネータは、指定されたパーサーが満たされるまで入力を消費します。
私はググってParserクラスのソースを垣間見ましたが、見つかりませんでした。このコンビネータは、他の言語のすべてのパーサー コンビネータ フレームワークに共通していると思います。
java - . between() を使用せずに jparsec からリストを返す方法
私は、JParsec ライブラリを使用して単純なパーサーに取り組んでおり、以下を解析したいと考えています。
これは with で簡単に実行parser.sepBy(Scanners.isChar(',')
できますが、between
.
最終的に、次の行に沿って何かを解析したいと考えています。
ただし、「sepBy X until (ただし、Y を消費しない)」または「sepBy X until failure」と言う魔法の組み合わせが見つかりません。
ここで簡単なものが欠けていますか?
java - この単純な jparsec lexer が失敗するのはなぜですか?
空白を無視して数字と数字のない単語を認識する単純なレクサーを作成します。
jparsec v3.0 を使用して次のコードを記述しました。
しかし、次のテストは例外で失敗しますorg.jparsec.error.ParserException: line 1, column 7: EOF expected, 1 encountered
。代わりに、文字列「abc cd 123」を使用すると、解析は成功します。
あなたの意見では、何が間違っていますか?