私はコンピューターサイエンスの学位を取得している大学生です。私の仲間の学生の多くは、実際には多くのプログラミングを行っていません。彼らはクラスの割り当てを行いましたが、ここで正直に言ってみましょう、これらの質問は実際にプログラミングの方法を教えてくれません。
私は他の何人かの学生に物事をどのように解析するかについて質問してきましたが、それを彼らに説明する方法がよくわかりません。部分文字列を探して行ごとに始めるか、トークンを作成し、BNFを使用するなど、適切な字句解析などを使用してより複雑な講義を行うのが最善ですか?私がそれを説明しようとするとき、彼らはそれを全く理解しません。
それらを混同したり、実際に試行することを妨げたりすることなく、これを説明するための最良のアプローチは何ですか。
解析は、ある種のデータを別の種類のデータに変換するプロセスとして説明します。
実際には、私にとって、これはほとんど常に文字列またはバイナリデータをプログラム内のデータ構造に変換することです。
たとえば、旋削
":Nick!User@Host PRIVMSG #channel :Hello!"
に(C)
struct irc_line {
char *nick;
char *user;
char *Host;
char *command;
char **arguments;
char *message;
} sample = { "Nick", "User", "Host", "PRIVMSG", { "#channel" }, "Hello!" }
解析 は、トークンのシーケンスで構成されたテキストを分析して、指定された(多かれ少なかれ)正式な文法に関する文法構造を決定するプロセスです。
次に、パーサーはトークンに基づいてデータ構造を構築します。このデータ構造は、コンパイラ、インタプリタ、またはトランスレータが実行可能なプログラムまたはライブラリを作成するために使用できます。
(ソース: wikimedia.org )
私があなたに英語の文を与え、その文を品詞(名詞、動詞など)に分解するように頼んだなら、あなたはその文を構文解析しているでしょう。
これは、私が考えることができる解析の最も簡単な説明です。
とはいえ、解析は重要な計算上の問題です。簡単な例から始めて、より複雑な方法に取り組む必要があります。
コンピューターサイエンスでは、解析はテキストを分析して特定の言語に属するかどうかを判断するプロセスです(つまり、その言語の文法に対して構文的に有効なです)。 構文解析 プロセスの略式の名前です。
たとえば、言語a^n b^n
(これは、同じ数の文字Aの後に同じ数の文字Bが続くことを意味します)。その言語のパーサーはAABB
入力を受け入れ、AAAB
入力を拒否します。それがパーサーの機能です。
さらに、このプロセス中に、さらに処理するためのデータ構造を作成できます。前の例では、たとえば、AA
とBB
を2つの別々のスタックに格納できます。
AA
やBB
に意味を与えたり、他の何かに変換したりするなど、その後に発生することはすべて解析されません。トークンの入力シーケンスの一部に意味を与えることを 意味解析 と呼びます。
構文解析の概念を理解する最良の方法は、より単純な概念から始めることだと思います。言語処理の主題で最も単純なものは、有限オートマトンです。正規表現などの正規言語の解析は形式主義です。
それは非常に簡単で、入力、状態のセット、遷移のセットがあります。アルファベット{ A, B }
、L = { w | w starts with 'AA' or 'BB' as substring }
の上に構築された次の言語を検討してください。以下のオートマトンは、すべての有効な単語が「AA」または「BB」で始まる言語の可能なパーサーを表しています。
A-->(q1)--A-->(qf)
/
(q0)
\
B-->(q2)--B-->(qf)
それはその言語の非常にシンプルなパーサーです。初期状態である(q0)
から開始し、A
である場合は入力からシンボルを読み取り、それ以外の場合は(q1)
状態に移動します(そうでない場合はB
、アルファベットはA
およびB
のみであることに注意してください。(q2)
状態に移動します。 (qf)
状態に達した場合、入力は受け入れられました。
視覚的であるため、パーサーとは何かを子供や子供に説明するために必要なのは鉛筆と紙だけです。オートマトンが構文解析などの言語処理の概念を教えるのに最も適した方法になっているのは、シンプルさだと思います。
最後に、コンピューターサイエンスの学生であるあなたは、形式言語や計算理論などのコンピューターサイエンスの理論クラスで、このような概念を深く研究します。
任意の単純な算術式を評価できるプログラムを作成してもらいます。これは理解するのが簡単な問題ですが、さらに深くなると、多くの基本的な解析が意味を成し始めます。
解析とは、1つの形式でデータを読み取ることなので、必要に応じて使用できます。
このように考えるように彼らに教える必要があると思います。したがって、これは、この概念に慣れていない人の解析を説明するために考えられる最も簡単な方法です。
一般に、人間がこのように考え、分割して征服し、コーディングしやすいので、一般に、一度に1行ずつデータを解析しようとします。
分割できないすべての最小データに対してフィールドを呼び出します。名前はフィールド、年齢は別のフィールド、姓は別のフィールドです。例えば。
行には、さまざまなフィールドを含めることができます。それらを区別するために、フィールドを区切り文字または各フィールドに割り当てる最大長で区切ることができます。
例:コンマでフィールドを区切る
ポール、20、ジョーンズ
またはスペース(名前は最大20文字、年齢は最大3桁、ジョーンズは最大20文字)
ポール020ジョーンズ
フィールドの前のセットはいずれもレコードと呼ばれます。
区切られたフィールドレコードを区別するには、レコードを区切る必要があります。ドットで十分です(CR/LFを適用できることは知っていますが)。
リストは次のとおりです。
マイケル、39、ジョーダン、シャキール、40、オニール、レブロン、24、ジェームズ。
またはCR/LFを使用
マイケル、39、ヨルダン
シャキール、40、オニール
レブロン、24、ジェームズ
好きな10人のnba(またはnlf)プレイヤーをリストするように言うことができます。次に、形式に従って入力する必要があります。次に、それを解析して各レコードを表示するプログラムを作成します。 1つのグループは、コンマ区切り形式でリストを作成し、固定サイズ形式でリストを解析するプログラムを作成できます。
言語学で、言語を分析可能な小さなコンポーネントに分割すること。たとえば、この文を解析するには、それを単語とフレーズに分割し、各コンポーネントのタイプ(動詞、形容詞、名詞など)を識別する必要があります。
解析は、多くのコンピューターサイエンス分野の非常に重要な部分です。たとえば、コンパイラはソースコードを解析してオブジェクトコードに変換する必要があります。同様に、複雑なコマンドを処理するアプリケーションは、コマンドを解析できる必要があります。これには、実質的にすべてのエンドユーザーアプリケーションが含まれます。
解析は、多くの場合、字句解析と意味解析に分けられます。字句解析は、句読点やその他のキーに基づいて、文字列をトークンと呼ばれるコンポーネントに分割することに集中しています。セマンティック解析では、文字列の意味を判断しようとします。
私にとって構文解析とは、何かを意味のある部分に分解することです。定義可能な、または定義済みの既知の共通の部分「定義」のセットを使用します。
プログラミング言語には、キーワード部分、使用可能な句読点シーケンスがあります...
パンプキンパイの場合、それは地殻、詰め物、トッピングのようなものかもしれません。
書かれた言語の場合、Wordとは何か、文章、動詞とは何か...
話し言葉の場合、音色、音量、気分、含意、感情、文脈
構文分析(および常識)は、解析対象がパンプキンパイかプログラミング言語かを判断します。クラストはありますか?多分それはカボチャのプリンか多分話された言語です!
ものの解析について注意すべきことの1つは、通常、物事を部分に分割する多くの方法があるということです。
たとえば、パンプキンパイを中央から端または下から上に切るか、スクープで詰め物を取り出すか、スレッジハンマーを使用するか食べることで、パンプキンパイを分割できます。
そして、物事をどのように解析するかによって、それらの部分で何かをすることが簡単か難しいかが決まります。
「コンピューター言語」の世界では、テキストソースコードを解析する一般的な方法があります。これらの一般的な方法(アルゴリズム)には、タイトルまたは名前があります。言語を解析する方法については、インターネットで一般的なメソッド/名前を検索してください。ウィキペディアはこの点で役立ちます。
簡単な説明:解析では、一連のルール(たとえば、区切り文字を使用)に従ってデータのブロックを小さな断片(トークン)に分割し、このデータを断片ごとに処理できるようにします(管理、分析、解釈、送信など) 。
例:多くのアプリケーション(スプレッドシートプログラムなど)は、CSV(カンマ区切り値)ファイル形式を使用してデータをインポートおよびエクスポートします。 CSV形式を使用すると、アプリケーションは特別なパーサーを使用してこのデータを処理できます。 Webブラウザには、HTMLおよびCSSファイル用の特別なパーサーがあります。 JSONパーサーが存在します。すべての特殊ファイル形式には、それら専用に設計されたパーサーがいくつか必要です。