人々が言うとき、彼らは「コン」で実際には手段「まとめ」、および何を意味するか、「Xはコンない」何をしてどのように、あなたは正確に「X」が何であるかに応じて、非常に異なることができ、それらを一緒に入れました。
また、「作曲しない」と言うとき、若干異なることを意味する場合があります。
- 2つのXを1つにまとめることはできません。
- 2つのXを組み合わせることができますが、結果はXではない可能性があります(IOW:Xは構成の下で閉じられません)。
- 2つのXを組み合わせることができますが、結果のXは期待どおりに機能しない可能性があります。
#1の例は、スキャナー/レクサーを使用したパーサーです。「スキャナー/レクサーは作曲しない」というフレーズを聞くかもしれません。実際にはそうではありません。それらが意味するのは、「別個の字句解析ステージを使用するパーサーは構成しない」です。
なぜパーサーを作成したいのですか?さて、あなたがJetBrains、Eclipse Foundation、Microsoft、またはEmbarcaderoのようなIDEベンダーであり、Webフレームワーク用のIDEを構築したいと想像してください。通常のWeb開発では、多くの場合、言語が混在しています。<script>
ECMAScriptを含む要素を含むHTMLファイルがあり、<style>
CSSを含む要素。HTML、一部のプログラミング言語、および一部のテンプレート言語のメタ構文を含むテンプレートファイルがあります。「Python」、「テンプレートに埋め込まれたPython」、「CSS」、「HTML内のCSS」、「ECMASCript」、「HTML内のECMAScript」、「HTML」、「HTMLテンプレート」など。Python用、HTML用、テンプレート言語用の構文ハイライターを作成し、3つをテンプレートファイル用の構文ハイライターに作成します。
ただし、レクサーはファイル全体をトークンのストリームに解析しますが、これはその1つの言語にのみ意味があります。他の言語のパーサーは、レクサーが渡すトークンを処理できません。たとえば、Pythonパーサーは通常、字句解析器がインデントを追跡し、偽物INDENT
とDEDENT
トークンをトークンストリームに挿入するように記述されているため、Pythonの構文が実際にそうでなくても、パーサーはコンテキストフリーになります。ただし、HTML lexerは空白文字を完全に無視します。HTMLでは意味がないためです。
ただし、単に文字を読み取るスキャナーレスパーサーは、文字ストリームを別のパーサーに渡すことができます。その後、パーサーはそれを戻すことができるため、作成がはるかに容易になります。
#2の例は、SQLクエリを含む文字列です。それぞれに構文的に正しいSQLクエリが含まれる2つの文字列を使用できますが、2つの文字列を連結すると、結果が構文的に正しいSQLクエリにならない場合があります。我々のようなクエリ代数を持っている理由のARel
、やる構成します。
ロックは#3の例です。ロックのある2つのプログラムがあり、それらを1つのプログラムに結合した場合、ロックのあるプログラムはまだありますが、2つの元のプログラムが完全に正しく、デッドロックや競合がない場合でも、結果のプログラムには必ずしもこれがありませんプロパティ。ロックの正しい使用法は、プログラム全体のグローバルプロパティであり、プログラムを作成するときに保持されないプロパティです。これは、例えば、取引、異なるやるコンを。トランザクションを正しく使用するプログラムは、別のそのようなプログラムで構成でき、トランザクションを正しく使用する結合プログラムを生成します。