問題タブ [recursive-descent]

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 に答える
1933 参照

java - このツリーの式を評価する方法は?

これは、私が使用している解析済み xml ファイルの例であり、それをタブでツリー形式にします

この入力が理解するのが難しくないことを願っています。XML ファイルから解析されない場合、通常は次のようになります。

等...

すべての割り当てペア (つまり、値と変数) はハッシュマップに格納されるため、その変数によって値を検索し、後の式で使用できます。文法に従って式を解決するために、再帰的降下評価器 (だと思いますか?) を使用します。

私は過去 24 時間にわたってあらゆる種類のものをグーグル検索し、基本的な算術演算 (2 + 3 * 8 など) の多くのツリー評価器を見てきましたが、それが私の特定の場合にどのように機能するかを確認できませんでした。木。

私がこれまでに書いたコードは、変数名 (a、b、c、d、e など) を見つけるのと同じくらい簡単ですが、正しい値を提供する再帰をコーディングする方法を考え始めることはできません。ハッシュマップ。

私のツリーのドキュメント、ノード、およびノー​​ドリスト クラスは、時間を大幅に節約できると思われる「getChild」メソッドを許可していないという点で珍しいものです。これがなぜなのか誰か知っていますか?

ここで本当にランダムな問題があり、それが理にかなっていることを願っています。ご不明な点がございましたら、お気軽にお問い合わせください。できる限り最善を尽くします。この問題を解決してくれる人を探しているわけではありませんが、この再帰アルゴリズムのコーディング方法を決定する方法を教えてくれるだけです。

編集:また、私が上に置いた2番目の「入力」は実際には出力でした。それはこうあるべきだった:

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

grammar - コンパイラ内で FIRST & FOLLOW セットをエンコードする方法

私が取っているコンパイラー設計コースのためにコンパイラーを書いています。現在、パーサーを書く必要がある構文解析に取り組んでいます。

ソース テキストに表示されるエラーを処理するには、FIRST セットと FOLLOW セットが必要です。文法内のすべての非終端記号の FIRST および FOLLOW セットを事前に計算しましたが、プログラム内で実際にエンコードする場所を決定するのに苦労しています。

キーが非ターミナルの名前であるマップにそれらを配置する必要がありますか?

どんなアドバイスも役に立ちます

この投稿は少し不明確に見えるかもしれませんが、必要に応じてポイントを明確にすることができます。

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

parsing - FIRSTセットとFOLLOWセットを再帰下降パーサーにエンコードします

これは、コンパイラー内でFIRST&FOLLOWセットをエンコードする方法について尋ねた前の質問のフォローアップですが、これは私のプログラムの設計に関するものです。

再帰下降パーサーを作成して、コンパイラーの構文解析フェーズを実装しています。ソースプログラムの構文のエラーをより効率的に処理できるように、FIRSTセットとFOLLOWセットを利用できる必要があります。すべての非終端記号のFIRSTとFOLLOWをすでに計算しましたが、プログラムのどこに論理的に配置するか、そしてそれを行うのに最適なデータ構造を決定するのに苦労しています。

注:すべてのコードは擬似コードになります

オプション1)マップを使用し、名前ですべての非終端記号を、FIRSTセットとFOLLOWセットを含む2つのセットにマップします。

これは実行可能なオプションのように見えますが、パーサーの内部では、FIRSTとFOLLOWを取得してエラー関数に渡すために、次のような醜いコードが必要になります。

オプション2)非終端記号ごとにクラスを作成し、FIRSTプロパティとFOLLOWプロパティを設定します。

これにより、コードが少し見栄えが良くなります。

これらは私が考えた2つのオプションです。これらの2つのセットをエンコードする方法について他の提案を聞きたいです。また、私が投稿した2つの方法に対する批評や追加も役に立ちます。ありがとう

私もここにこの質問を投稿しました:http://www.coderanch.com/t/570697/java/java/Encode-FIRST-FOLLOW-sets-recursive

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

parsing - 再帰降下パーサーの実装

再帰降下パーサーの疑似コードを書きたいと思っています。今、私はこのタイプのコーディングの経験がありません。オンラインでいくつかの例を読んだことがありますが、それらは数式を使用する文法でのみ機能します。これが私がパーサーのベースにしている文法です。

メソッドS()L()andを記述E()していくつかのエラー メッセージを返す必要がありますが、オンラインで見つけたチュートリアルはあまり役に立ちませんでした。誰かが私を正しい方向に向けて、いくつかの例を教えてもらえますか?.

C# や Java の構文の方が理解しやすいので、C# や Java の構文で書きたいと思います。


アップデート

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

parsing - 曖昧さのない文法

算術式の曖昧さのない文法を作りたい。これで、べき乗の優先順位が高くなり、右側に関連付けられるはずです。他のすべての操作は左側に関連付けられています。これは私がこれまでに持っているものですが、べき乗が正しいかどうかはわかりません

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

c++ - C++ で単純な再帰降下パーサーを使用して基本的な算術演算 ("5+5" など) を解析するにはどうすればよいですか?

これはしばらくの間私の心にありました。私は再帰降下パーサーに興味を持っており、その実装方法を知りたいと思っています。私が欲しいのは、「5+5」や「(5+5)*3」などの単純な算術演算を理解できる単純なパーサーです。

最初のステップは、入力文字列全体を取得して多くの部分文字列に分割する「トークナイザー」を作成することだと思います。私が行ったこの部分 (私はそれについてここで尋ねなければなりませんでした。ここにも関連コードを投稿しているので、したくない場合はリンクをたどる必要はありません。)私の、私は の 、またはトークンで終わりvectorますstring。ここで難しいのは、これらのトークンを解析したいということです。

ウィキペディアの recursive descent parsers に関する記事を読みました。全体的な概念は理解できますが、いつものように、実装は少しわかりにくいです。その記事には、非常に単純なプログラミング言語用の再帰降下パーサーの C 実装があり、記事でも説明されています。私はそのコードをできる限り研究し、基本的に同じことを書き込もうとしましたが、それは自分のプログラムのためでした。以下がそのコードです。

私が本当に混乱しているのは、このパーサーが何をするかです。プログラムを通過し、文法の特定の部分を「期待」しているようです。しかし、それがそこに到達すると、それは何をしますか? たとえば、「用語」を解析することになっているウィキペディア コードの 1 つの関数を次に示します。

これは、次の文法を解析するためのものです。

これは理にかなっています。しかし、それは実際の用語で何をしますか? その用語が単に「6」である、または「3*2」であり、値が 6 であることが判明したとしましょう。それを残りの入力にどのように組み込むのでしょうか? (6 を返すために) の代わりにterm()a を返すべきではありませんか? それとも他の方法で行われますか?doublevoid

また、このようなパーサーでコードを出力することと、入力に対してすぐに動作すること (つまり、コンパイラーとインタープリター) の違いは何でしょうか? これら 2 つ (少なくともこの例では) は理論的には同じ方法で実装されていますか、それとも根本的に異なっていますか?

任意の入力を歓迎します。これまでの私のコードは次のとおりです。

編集:私のコードは常にERROR: syntax error関数から: を出力することに言及する必要がありfactor()ます。

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

bash - bash 再帰 CSV パーサー

この質問をコードレビューに移動しました

私は bash で再帰降下パーサーを書きました。

何か参考になる点を教えていただけないでしょうか。バックスラッシュ エスケープと引用符で囲まれたフィールドを解析エラー レポートでサポートします。

スクリプトはcut、ファイルから入力を取得したりstdin、ユーザーが印刷する行とフィールドを選択できるようにするなど、いくつかの方法で機能します。オプション-l-fそれぞれを使用します。フィールドのリストを出力し、オプション --list '1 2 3 4 5' および --list-seperator $'\n' などを使用して、そのリストのカスタム区切り文字を指定できます。

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

parsing - AWK:再帰下降CSVパーサー

BASHの再帰下降CSVパーサーに対応して、私(両方の投稿の元の作成者)は、データ処理とこれらのスクリプト言語の速度を比較するために、次のようにAWKスクリプトに変換しようとしました。いくつかの緩和要因があるため、翻訳は1:1の翻訳ではありませんが、興味のある人にとっては、この実装は他の実装よりも文字列処理が高速です。

もともと、ジョナサン・レフラーのおかげですべてが潰されたいくつかの質問がありました。タイトルには「」と記載CSVされていますが、コードが更新されましたDSV。つまり、必要に応じて、フィールド区切り文字として任意の1文字を指定できます。

これで、このコードは対決の準備ができました。

基本的な機能

  • 入力長、フィールド長、またはフィールド数に制限はありません
  • 二重引用符によるリテラル引用符フィールド"
  • ここでセクション1.1.2 [1][2][3]で定義されているANSICエスケープシーケンス
  • カスタム入力区切り文字:UNIXプログラミングの技術(DSV)[4]
  • カスタム出力区切り文字[5]
  • UCS-2およびUCS-4エスケープシーケンス[6]

[1]引用符で囲まれたフィールドはリテラルコンテンツであるため、引用符で囲まれたコンテンツに対してエスケープシーケンスの解釈は実行されません。ただし、引用符、プレーンテキスト、および解釈されたシーケンスを1つのフィールドに連結して、目的の効果を実現することができます。例えば:

CSVの3つのフィールド行であり、3番目のフィールドは次のものと同等です。

[2]参考資料で「実装固有」または「未定義の動作」を持っていると説明されている例は、定義上移植性がないか、あいまいすぎて信頼できないため、サポートされません。エスケープシーケンスがここまたは参考資料で定義されていない場合、円記号は無視され、最後から1番目の文字がプレーンテキスト値として扱われます。整数値の文字エスケープシーケンスはサポートされません。これは信頼性の低い方法であり、複数のプラットフォーム間で適切に拡張できず、不必要に検証のプロキシによる解析の複雑さが増します。

[3] 8進数の文字エスケープは、3桁の8進数形式である必要があります。3桁の8進数のエスケープシーケンスでない場合は、1桁のnullエスケープシーケンスです。16進エスケープシーケンスは、2桁の16進形式である必要があります。エスケープシーケンス識別子に続く最初の2文字が無効な場合、解釈は行われず、メッセージが標準エラーで出力されます。残りの16進数は無視されます。

[4]カスタム入力区切り文字iDelimiterは1文字である必要があります。複数行のレコードはサポートされないため、このような矛盾の使用は常に眉をひそめる必要があります。これにより、データレコードの移植性が低下し、(そのファイル内の)場所と出所が不明な可能性のあるファイルに固有になります。たとえば、grepコンテンツのファイルをingすると、コンテンツが前の行から始まる可能性があるため、不完全なレコードが返される可能性があり、データ取得がデータベースの完全なトップダウン解析に制限されます。

[5]カスタム出力区切り文字oDelimiterは、任意の望ましい文字列値にすることができます。スクリプト出力は常に単一の改行で終了します。これは、正しい端末アプリケーション出力の機能です。そうしないと、解析されたCSV出力とターミナルプロンプトが同じ行を消費し、混乱を招く状況になります。また、コンソールのようなほとんどの通訳者は、改行がI/Oレコードの終了を通知することを期待する回線ベースのデバイスです。末尾の改行が望ましくない場合は、切り取ります。

[6] 16ビットUnicodeエスケープシーケンスは、次の表記法で使用できます。

および32ビットUnicodeエスケープシーケンスは、次の方法でサポートされます。


SOコミュニティのすべてのメンバーに感謝します。その経験、時間、およびインプットにより、情報を処理するための非常に便利なツールを作成することができました。

コードリスト:dsv.awk


**「プロのように」スクリプトを実行する方法**

カスタム出力制御セパレーターが必要であるが、何を使用すればよいかわからない場合は、この便利なASCIIチャートを参照してください。

今後の計画:


哲学

エスケープシーケンスは、行ベースのデータベースに複数行のフィールドデータを作成するために常に使用する必要があり、引用符は、レコードフィールドのコンテンツを保持および連結するために常に使用する必要があります。これは、このタイプのレコードパーサーを実装するための最も簡単な(したがって最も効率的な)方法です。私は、すべてのソフトウェア開発者と教育機関がこの方向性を採用し、公言して、ラインベースの区切り文字で区切られたレコードの移植性と正確な取得を確保することをお勧めします。

CSVには、 RFC 4180以外の公式の仕様はなく、有用なポータブルレコードタイプは定義されていません。15年以上の経験を持つ開発者として、これがポータブルCSV/DSVレコードの公式に認められた標準になることを願っています。

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

parsing - 再帰下降パーサーとネストされた括弧

私は文法と構文解析の分野に不慣れです。

次のような文字列を評価する再帰下降パーサーを作成しようとしています。

((3 == 5 AND 4 == 5)OR(6 == 6))

ネストされた括弧の処理を開始するまで、すべてが正常に機能します。基本的に、ターゲット文字列の終わりに到達するのが早すぎます。

問題は、「6」のようなトークンや最後から2番目の括弧に遭遇したときに、それを評価してから次のトークンに移動するという事実に起因すると思います。次のトークンに進むためのコードを削除しますが、どのように進めるかわかりません。

私の文法は、次のようになっています(「=>」記号は、ルールの「翻訳」を表す私自身の表記法です)。

テスト:CompoundSentenceの場合CompoundSentence | 重文

CompoundSentence :( CompoundSentence)PCSopt|CompoundSentence接続詞文|

文=>

CompoundSentence =(CompoundSentence)PCSopt | 文CSOpt

PCSOpt = ParenConjunction CompoundSentence PCSOpt | イプシロン

CSOpt=接続詞CSOpt| イプシロン

ParenConjunction:そして|または

接続詞:そして|または

文:主語の動詞の接頭辞

件名:件名の中置値| 値=>

件名=値SubjectOpt

SubjectOpt=中置値SubjectOpt| イプシロン

動詞:== |!= |> | <

述語:述語中置値| 値=>

Predicate = Value PredicateOpt

PredicateOpt=中置値PredicateOpt| イプシロン

中置:+、-、*、/

複文の私のコードは次のとおりです。

私が言っているように、私はこの分野に不慣れなので、おそらく非常に基本的なことを理解していません。

誰かが私を正しい方向に導くことができれば、私はそれを大いに感謝します。

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

parsing - 再帰下降パーサー - 左再帰の回避

私は次の作品を持っています

したがって、次のような左再帰があることは明らかです

左再帰は、次のルールを使用して回避できると言われています

ここで左再帰をどのように回避しますか?.関数 A' にはまだ再帰があります。誰でも私にこれを説明できますか.私はこの主題の初心者ですか?