タグ付けされた質問 「parsing」

(非)構造化データを分析して、構造化された正規化形式に変換します。


4
Parser Combinatorを使用する場合 パーサージェネレーターを使用する場合
最近、パーサーの世界を深く掘り下げて、独自のプログラミング言語を作成したいと考えています。 しかし、パーサーを作成するには、パーサージェネレーターとパーサーコンビネーターという2つの異なるアプローチが存在することがわかりました。 興味深いことに、どのケースでどのアプローチが優れているかを説明したリソースを見つけることができませんでした。むしろ、資源(および人)の多くは、私は、他のアプローチを知っているだけで説明していない主題について質問彼らのようなアプローチをアプローチし、他のすべてのに言及していません。 有名なドラゴンブックは字句/スキャンに入ると、(f)LEXに言及しているが、すべてのパーサコンビネータを言及していません。 言語実装パターンは、Javaで構築されたANTLR Parser Generatorに大きく依存しており、Parser Combinatorsについては一切言及していません。 HaskellのParser CombinatorであるParsecのParsec入門チュートリアルでは、Parser Generatorsについてはまったく言及していません。 Boost :: spirit、最も有名なC ++ Parser Combinatorは、Parser Generatorsについてまったく言及していません。 パーサーコンビネーターを発明した可能性のある優れた説明ブログ投稿では、パーサージェネレーターについては一切言及していません。 簡単な概要: パーサージェネレーター パーサージェネレーターは、Extended Backus-Naur形式の方言であるDSLで記述されたファイルを受け取り、それを(コンパイル時に)このDSLで記述された入力言語のパーサーにできるソースコードに変換します。 これは、コンパイルプロセスが2つの別々のステップで実行されることを意味します。興味深いことに、パーサージェネレーター自体もコンパイラーです(そしてそれらの多くは実際に自己ホスト型です)。 パーサーコンビネーター パーサーコンビネーターは、すべてがパラメーターとして入力を受け取るパーサーと呼ばれる単純な関数を記述し、一致する場合、この入力の最初の文字を抜き取ります。パーサーがこの入力から何も解析できなかった場合は、タプルを返します。タプル(result, rest_of_input)はresult空(nilまたはNothing)の場合があります。例はdigitパーサーです。もちろん、他のパーサーは、パーサーを最初の引数(最後の引数は入力文字列のまま)として、それらを結合many1できます。 言うまでもなく、新しいパーサーを作成するために、もちろん(compose)digitとを組み合わせることができmany1ますinteger。 また、choiceパーサーのリストを取得し、それぞれを順に試す、より高レベルのパーサーを作成することもできます。 このようにして、非常に複雑なレクサー/パーサーを構築できます。演算子のオーバーロードをサポートする言語では、ターゲット言語で直接記述されていても、EBNFに非常によく似ています(ターゲット言語のすべての機能を使用できます)。 単純な違い 言語: パーサージェネレーターは、EBNFのようなDSLと、これらのステートメントが一致したときに生成するコードの組み合わせで記述されます。 パーサーコンビネーターは、ターゲット言語で直接記述されています。 字句解析/解析: パーサージェネレーターは、「レクサー」(文字列をタグ付けされたトークンに分割して、処理している値の種類を示す)と「パーサー」(レクサーからトークンの出力リストを取得する)そしてそれらを組み合わせて、抽象構文ツリーを形成しようとします)。 パーサーコンビネーターには、この区別はありません/必要ありません。通常、単純なパーサーは「レクサー」の作業を実行し、より高レベルのパーサーはこれらの単純なパーサーを呼び出して、作成するASTノードの種類を決定します。 質問 しかし、これらの違いを考えると(そしてこれはおそらく完全なものではありません!)、いつどれを使用するかについて知識のある選択をすることはできません。これらの違いの意味/結果が何であるかはわかりません。 パーサージェネレーターを使用すると、問題をより適切に解決できることを示す問題のプロパティは何ですか?Parser Combinatorを使用して問題を解決する方が適切であることを示す問題のプロパティは何ですか?

4
抽象構文ツリーはどのくらい正確に作成されますか?
私はASTの目標を理解しており、以前にツリー構造をいくつか構築したことがありますが、ASTを構築したことはないと思います。ノードはテキストであり番号ではないため、ほとんど混乱しています。そのため、コードを解析しているときにトークン/文字列を入力する良い方法は考えられません。 たとえば、ASTの図を見ると、変数とその値は等号のリーフノードでした。これは私にとって完全に理にかなっていますが、これをどのように実装しますか?私はケースバイケースでそれを行うことができると思うので、「=」につまずいたとき、ノードとしてそれを使用し、「=」の前に解析された値をリーフとして追加します。私はおそらく構文に応じて、たくさんの事柄のケースを作成しなければならないので、それは間違っているようです。 そして、私は別の問題に遭遇しました、ツリーはどのように横断されますか?高さを一番下に移動し、最下部に到達したらノードを上に移動し、隣のノードでも同じことをしますか? ASTで多数の図を見てきましたが、コードで簡単な例を見つけることができませんでした。おそらく役立つでしょう。

2
現代の言語はまだパーサージェネレーターを使用していますか?
これが出てきたとき、私はここウィキペディアで gccコンパイラスイートについて調査していました: GCCはBisonで生成されたLALRパーサーの使用を開始しましたが、徐々に手書きの再帰パーサーに切り替えました。2004年のC ++、および2006年のCおよびObjective-Cの場合。現在、すべてのフロントエンドは手書きの再帰下降パーサーを使用しています。 最後の文で(そしてウィキペディアを信頼する限り)私は間違いなく「C(gcc)、C ++(g ++)、Objective-C、Objective-C ++、Fortran(gfortran)、Java(gcj)、 Ada(GNAT)、Go(gccgo)、Pascal(gpc)、... Mercury、Modula-2、Modula-3、PL / I、D(gdc)、およびVHDL(ghdl)」はすべてフロントエンドであり、パーサージェネレーターを長く使用します。つまり、それらはすべて手書きのパーサーを使用します。 私の質問は、このプラクティスはどこにでもあるのですか?特に、[Python、Swift、Ruby、Java、Scala、ML、Haskell]のxの「xの標準/公式実装には手書きパーサーがありますか」に対する正確な答えを探していますか?(実際、他の言語に関する情報もここで歓迎されています。)掘り下げた後、私は自分でこれを見つけることができると確信しています。しかし、これはコミュニティによって簡単に答えられると確信しています。ありがとう!

6
HTMLで厳密な解析が選択されなかったのはなぜですか?
HTMLの作成時に厳密な解析が選択されなかった理由をよく考えました。インターネットの歴史のほとんどにおいて、ブラウザはあらゆる種類のマークアップを受け入れ、それを解析するために最善を尽くしています。このプロセスはパフォーマンスを低下させ、人々が意味不明なものを書くことを許可し、時代遅れの機能を中止することを困難にします。 HTMLが厳密に解析されない特定の理由はありますか?
38 html  history  parsing 

1
C ++ 11にはstd :: stoiが含まれていますが、std :: itosはどうですか?
C ++ 11にはstd::sto@文字列からints / floats / longsを簡単にアンパックするための関数ファミリーがあることに気がつきました。しかし、その反対が実装されていないことに驚いています。なぜ標準化委員会には、std::itosints / floats / whatever(back)から文字列に戻るための関数ファミリーが含まれていないのですか?
37 c++  parsing  strings  c++11 

5
コメントは通常どのように解析されますか?
プログラミング言語とマークアップでは、コメントは一般にどのように扱われますか?私はいくつかのカスタムマークアップ言語のパーサーを書いており、最も驚きの少ない原則に従うことを望んでいるので、一般的な規則を決定しようとしています。 たとえば、トークン内に埋め込まれたコメントは、トークンと「干渉」する必要がありますか?一般的に、次のようなものです: Sys/* comment */tem.out.println() 有効ですか? また、言語が改行に敏感であり、コメントが改行にまたがっている場合、改行を考慮するかどうか stuff stuff /* this is comment this is still comment */more stuff として扱われる stuff stuff more stuff または stuff stuff more stuff ? 私はいくつかの特定の言語が何をするかを知っており、意見を求めていませんが、トークンと新しい行に関してマークアップによって一般的に期待される一般的なコンセンサスはありますか? 私の特定のコンテキストは、Wikiのようなマークアップです。
31 parsing  comments 

1
Inglishパーサー(Hobbit 1982用)
「Inglish」と呼ばれる信じられないほど堅牢なパーサーを備えたテキストアドベンチャーゲームThe Hobbitについて読むことに魅了されました。 ... Inglishは、「ガンダルフに好奇心の強い地図について尋ねてから、剣を持ってトロールを殺す」などの高度な文を入力することを許可しました。パーサーは複雑で直観的で、代名詞、副詞(「悪意を持ってゴブリンを攻撃する」)、句読点、前置詞を導入し、これまで不可能だった方法でプレイヤーがゲームの世界とやり取りできるようにしました。 Inglishパーサーエンジンとそれを開発したプログラマーの歴史および/または遺産について誰か知っているかどうか疑問に思っています。

8
メモリの割り当てをいつ解除するかを静的に予測することは可能ですか?ソースコードからのみですか?
メモリ(およびリソースロック)は、プログラムの実行中の確定的なポイントでOSに返されます。プログラムの制御フローだけで、特定のリソースの割り当てを確実に解除できる場所を知るのに十分です。人間のプログラマーがfclose(file)、プログラムが完了したときにどこに書くべきかを知っているように。 GCは、制御フローが実行されるランタイム中に直接把握することでこれを解決します。しかし、制御フローについての真実の本当のソースはソースです。したがって、理論的にはfree()、ソース(またはAST)を分析することで、コンパイルの前に呼び出しを挿入する場所を決定できるはずです。 参照カウントはこれを実装するための明らかな方法ですが、ポインターがまだ参照されている(まだスコープ内にある)けれども不要になった状況に遭遇するのは簡単です。これは、ポインタを手動で割り当て解除する責任を、それらのポインタへのスコープ/参照を手動で管理する責任に変換するだけです。 プログラムのソースを読み取ることができるプログラムを作成することが可能であるように思われます。 プログラムの制御フローのすべての順列を予測する---プログラムのライブ実行を監視するのと同様の精度 割り当てられたリソースへのすべての参照を追跡する 参照ごとに、参照が絶対に参照解除されないことが保証される最も早いポイントを見つけるために、後続の制御フロー全体をトラバースします。 その時点で、ソースコードのその行に割り当て解除ステートメントを挿入します すでにこれを行うものはありますか?RustやC ++スマートポインター/ RAIIは同じものだとは思わない。
27 parsing  memory 

5
このタイプのパーサーの名前、または存在しない理由
従来のパーサーは入力全体を消費し、単一の解析ツリーを生成します。私は、連続ストリームを消費して解析フォレストを生成するものを探しています[ 編集:この用語の使用が型破りな理由に関するコメントの議論を参照してください ]。私の腸は、私がそのようなパーサーを最初に必要とする(または必要だと思う)ことはできないと言っていますが、私は何ヶ月も何度も検索しました。 私はXYの問題に陥る可能性があることを認識しています。私の最終的な目的は、テキストストリームを解析し、そのほとんどを無視し、認識されたセクションから解析ツリーのストリームを生成することです。 したがって、私の質問は条件付きです:これらの特性を持つパーサーのクラスが存在する場合、それは何と呼ばれますか? もしそうでなければ、なぜですか? 代替手段は何ですか?おそらく、私は従来のパーサーに私が望むことをさせる方法をいくつか逃しています。
27 parsing 

6
クトゥルフの方法の解析に対する議論は何ですか?
会社にとって非常に重要になる可能性のあるツールのために、ドメイン固有言語を実装するタスクを割り当てられました。この言語は単純ですが、些細なことではなく、ネストされたループ、文字列の連結などを既に許可しており、プロジェクトが進むにつれて他の構成要素が追加されることは実質的に確実です。 レクサー/パーサーを手書きで書くことは(文法が簡単でない限り)時間がかかり、エラーが発生しやすいプロセスであることを経験から知っています。そのため、yaccのパーサージェネレーターまたはParsecのような組み合わせライブラリーという2つのオプションがありました。前者も同様に優れていましたが、さまざまな理由で後者を選び、関数型言語でソリューションを実装しました。 結果は私の目にはかなり壮観で、コードは非常に簡潔で、エレガントで読みやすく/流fluentです。java / c#以外でプログラミングしたことがない場合、少し奇妙に見えるかもしれないと思いますが、java / c#で書かれていないものには当てはまります。 しかし、ある時点で、文字通り同僚に攻撃されました。私の画面を一目見た後、彼はコードが理解不能であり、解析を再発明するのではなく、誰もがするようにスタックとString.Splitを使用するだけだと宣言しました。彼は多くの騒ぎをしました、そして、私は彼を納得させることができませんでした、私が彼を信じることができませんでした 私は彼に言語を説明することさえ申し出ましたが、役に立ちませんでした。 私は議論が経営陣の前で再浮上することを確信しているので、いくつかの確固たる議論を準備しています。 これらは、String.Splitベースのソリューションを回避するために頭に浮かんだ最初のいくつかの理由です。 特殊なケースや物事を迅速に制御不能にするには、多くのifが必要です 多数のハードコードされた配列インデックスにより、メンテナンスが困難になります メソッドの引数として関数呼び出しのようなものを処理することは非常に困難です(例:add((add a、b)、c) 構文エラーの場合に意味のあるエラーメッセージを提供することは非常に困難です(発生する可能性が非常に高い) 私はすべて単純さ、明快さ、そして不必要なスマート暗号のようなものを避けるためにいますが、バーガーフリッパーでも理解できるようにコードベースのすべての部分を馬鹿にすることは間違いだと思います。インターフェースを使用しない、懸念事項の分離を採用しない、コードをコピーアンドペーストするなど、私が聞いたのと同じ議論です。結局、ソフトウェアプロジェクトに取り組むには、最低限の技術的能力と学習意欲が必要です。(この議論はおそらく不快に聞こえるかもしれませんが、戦争を開始しても誰も助けにはなりません) クトゥルフの方法を解析することに対するあなたの好きな議論は何ですか?* *もちろん、彼が正しいと私を納得させることができれば、私も完全に幸せになります

3
どのプロセスで構文エラーが発生しますか?(トークン化または解析)
私はコンパイルと解釈を理解しようと、段階的に全体像を把握しようとしています。だから、この記事を読んでいる間に質問に思いついた。http://www.cs.man.ac.uk/~pjj/farrell/comp3.htmlこの記事 それは言います: コンパイラの次の段階は、パーサーと呼ばれます。コンパイラのこの部分は、言語の文法を理解しています。構文エラーを特定し、エラーのないプログラムを別の言語で解釈または書き出すことができる内部データ構造に変換する責任があります。 しかし、トークナイザーが構文エラーのある特定のストリームを適切にトークン化する方法を理解できませんでした。 そこにとどまるか、パーサーに間違った情報を提供する必要があります。トークン化は一種の翻訳者でもないのですか? したがって、トークン化中にコードの字句破損行をどのように単に克服するか。 トークナイザーの見出しの上のリンク内にトークンの例があります。 私が理解しているように、トークンの形式は次のように思えます。コードに何か問題があると、トークンも破損します。 私の誤解を明確にしていただけますか?

3
抽象構文ツリーの訪問者パターンの実装
私は自分のプログラミング言語を作成している最中で、それは学習目的のためにしています。私はすでに自分の言語のサブセット用にレクサーと再帰降下パーサーを作成しました(現在、などの数式をサポートし+ - * /ています)。パーサーは、抽象構文ツリーを返します。抽象ツリーでは、Evaluateメソッドを呼び出して式の結果を取得します。すべて正常に動作します。ほぼ私の現在の状況は次のとおりです(C#のコード例、これはほとんど言語に依存しません): public abstract class Node { public abstract Double Evaluate(); } public class OperationNode : Node { public Node Left { get; set; } private String Operator { get; set; } private Node Right { get; set; } public Double Evaluate() { if (Operator == "+") return …

12
コマンドインタープリター/パーサーの書き方
この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 問題:コマンドを文字列の形式で実行します。 コマンド例: /user/files/ list all; に相当: /user/files/ ls -la; 別のもの: post tw fb "HOW DO YOU STOP THE TICKLE MONSTER?;" に相当: post -tf "HOW DO YOU STOP THE TICKLE MONSTER?;" 現在のソリューション: tokenize string(string, array); switch(first item in array) { case "command": if ( …

4
RPGボードゲームルールの汎用ルールパーサー-実行方法
ペンとペーパースタイルのRPGシステム用の汎用ルールパーサーを構築したいと思います。ルールには通常、1〜Nエンティティの1〜Nのサイコロの役割と、エンティティの複数の属性に基づいた値の計算が含まれます。 例えば: プレイヤーはSTR 18を持っています。彼の現在装備している武器は、STR +1のボーナスを与えますが、DEX -1のマルスを与えます。彼はモンスターエンティティを攻撃し、一連のルールまたはアクションを実行するためにゲームロジックが必要になりました。 プレイヤーがサイコロを振る場合、たとえば8以上を取得した場合(渡す必要がある基本攻撃値は基本属性の1つです!)、攻撃は成功します。その後、モンスターはサイコロを振り、攻撃がその鎧を通過するかどうかを計算します。「はい」の場合、攻撃がブロックされていない場合、損害が発生します。 単純な数学ルールに加えて、特定のクラスのユーザー(たとえば、戦士vsウィザード)または他の属性にのみ適用するなどの制約もあります。したがって、これは数学的な操作だけに限定されません。 DungeonやDragonsのようなRPGシステムに精通しているなら、私が何をしているのかわかるでしょう。 私の問題は、これを最善の方法で正確に構築する方法がわからないということです。あらゆる種類のルールを設定し、後でプレイヤーとモンスターを選択するなどのアクションを実行し、アクション(攻撃などのルールセット)を実行できるようにしたいのです。 私は物事のデータベース側での助けを求めていませんが、ルールを柔軟に保つために構造とパーサーをどのように思い付くかについてもっと求めています。ちなみにこれに適した言語はphpです。 編集I: 目標を洗練させましょう:複雑なゲームルールを構築するために、ユーザーフレンドリーなインターフェイス(誰かがプログラミング言語を習得する必要がない)を作成したいと思います。単純な理由:個人的な使用は常にすべてのルールを覚える必要がないため、単純にそれほど頻繁にプレイしないので、毎回ルールを調べるのは止めになります。また、何かをして学ぶための楽しいタスクのように見えます。:) 私がこれまでに試したこと:間違ったアーキテクチャを構築する時間を無駄にするのではなく、コンセプトについて考えるだけです。これまでのところ、ユーザーが必要な数の属性を作成し、任意の種類のエンティティに必要な数の属性を割り当てることができるようにするという考えがあります。エンティティは、プレイヤー、モンスター、アイテム、あらゆるものです。ルールパーサーが何かを計算するとき、Player.base_attack + dice(1x6)> Monster.armor_check then Monster.health-1; ここでの質問は、そのパーサーの作成方法に関するものです。 編集II: 非常に基本的な値の例を次に示しますが、適切に計算するには、考慮すべきさまざまなものや変数がたくさんあります。 基本攻撃ボーナス(期間)基本攻撃ボーナス(通常、d20コミュニティではBABと呼ばれます)は、キャラクタークラスとレベルから派生した攻撃ロールボーナスです。基本攻撃ボーナスは、キャラクタークラスごとに異なるレートで増加します。キャラクターは、基本攻撃ボーナスが+6に達するとラウンドごとに2番目の攻撃を獲得し、3番目は基本攻撃ボーナスが+11以上、4番目は基本攻撃ボーナスが+16以上になります。マルチクラスキャラクターのスタックなど、さまざまなクラスから得られる基本攻撃ボーナス。キャラクターの基本攻撃ボーナスは、+ 16に達した後は攻撃を許可せず、+ 0より小さくすることはできず、キャラクターレベルが20に達した後のクラスレベルにより増加しません。特定の特技には、最低限の基本攻撃ボーナスが必要です。 ここでそれを読むことができます。http: //www.dandwiki.com/wiki/Base_Attack_Bonus_(Term)は、基本攻撃に必要な値を計算するための独自のルールを持つクラスと特技へのリンクを含みます。 できるだけ汎用的にすると、良いルールパーサーを完成させるのがかなり難しくなると思い始めました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.