「プログラミング/共通知識」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎変数: 比較的古くからある言語では、大文字・小文字を区別しない傾向にあります。具体的には、FortranCOBOLLispALGOLBASICは大文字・小文字を区別しません。理由は1つではありませんが、有力な理由の1つに小文字がコードがコード化されたASCIIが制定される1963年より前、あるいは同時期に言語設計と言語処理系の実装が行われたから、と考えられます。むしろC言語(1972)が比較的古い言語であるにもかかわらず小文字を区別していることが特異的といえます。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎字句解析機・構文解析器: 構文解析器と字句解析器を取違える間違えがあった。;構文の衝突に関する言及。lex yacc あるいはキーワード解析の完全ハッシュ関数化に関しては、コラムにまとめる予定。
タグ: 2017年版ソースエディター
212 行
この様に、'''言語処理系の主要な実装が'''あるいは多くの場合は最初の実装が、インタプリタなのかコンパイラなのかで分類しているので、例外が生じる余地があります。
 
== 字句解析器・構文解析器 ==
==レキシカル・アナライザ==
== 字句解析器 ==
ソースコードは通常の文字列ですが、文字列のママ構文解析を行うことは出来ないので、文字列からトークンを切りだします。
ソースコードは通常の文字列ですが、まずは、空白での区切りや既知のキーワードあるいは区切子に鑑み、文法上の最小単位の列に還元します。
トークンを切り出すプログラムのことをレキシカル・アナライザあるいは構文解析器(こうぶんかいせきき)と呼びます。
この文法上の最小単位をトークンと呼びます。
トークンとは、プログラミング言語のキーワード・識別子・デリミターなどのこれ以上分解すると意味が変わってしまう構文単位で、自然言語学の語に近い概念です。
トークンを切り出すプログラムのことを字句解析器(じくかいせきき;''lexical analyzer'' レキシカルアナライザー)あるいは構文解析器(こうぶんかいせきき)トークナイザー(''Tokenizer'')と呼びます。
 
=== パーサ構文解析器 ===
レキシカル・アナライザ字句解析器の出力は、トークンの1次元配列(トークン列)でこれから直接機械語に変換る事はできません
トークン列を先頭から読出し、プログラミング言語の構文の何に当てはまるか解析、パターンマッチングを行い、一致たパターンに従い内部表現(構文木など)に変換します。
このようなプログラムのことを、トークン列から構文を解析して解釈する機械という意味で、構文解析器(こうぶんかいしゃくき;''parser'' パーサ parser)ー)言い呼びます。
構文解析にあたって、解析中のトークン列の注目している部分が、2つ以上の構文にマッチすることがあります(構文規の衝突;例えば懸垂if)。
この様な場合は、優先順位や結合方向を文法で規定することにより、一意にマッチする構文が定まるよう、実装上の工夫が必要です。
 
字句解析と構文解析を別々に行うことが可能なプリグラミング言語もありますが、多くのプログラミング言語では(文法に曖昧さがあったり、字句に対し意味論が重複している<ref>例えば、C++では、キャストと関数呼出しあるいは初期化の構文に衝突があり、型や関数の定義状況との照会を行わないと、構文の特定ができません。</ref>などの理由で)字句解析と構文解析は連携するする必要がありし実装されています。
 
== 文法 ==