私は、学生なのですがまだ夏休みではありません。お盆からです。今年度だけなのか来年度以降もそうなのかよくわからないのは困りモノです。

それはともかく、もう字句の世界とおさらばしそうです。つまり字句編最後です。

字句
キーワード
識別子
整数リテラル
浮動小数点数リテラル
文字列リテラル
区切り子
改行文字
前字句
キーワード
識別子
整数リテラル
浮動小数点数リテラル
文字列リテラル
区切り子
空白文字
改行文字

こうした上で、「ソースコード ::= 前字句*」と定義します。例えば文字列リテラルが閉じ忘れたコードを解析すると、前字句に該当しない文字が現れたということで、コンパイルエラーにできます。

次に、前字句を字句へ変換します。と言っても、空白文字は無視し、ほかはそのまま1対1に対応させるだけです(前字句「キーワード」を字句「キーワード」にすると言う具合)。なんでこんなことをするかというと、本来ならこの際にコメントを空白へ置き換えたり、前処理(プリプロセス)を行ったりするからなのです。しかし、ここではそのような処理を省略しているのでほとんど意味がなくなっています。ちなみに、C/C++ではこの前字句に当たるものを前処理字句と呼び、前処理字句と字句は1対1の対応関係を持っていません。

その前に1つ問題を明らかにしておきます。「12」という並びは、整数リテラル「1」と整数リテラル「2」が順に現れているのか、整数リテラル「12」が現れているのかという具合に複数の解釈ができる場合があります。ここでは、深く考えずに最長一致で探索すると決めて解決します。こうすれば先の例では整数リテラル「12」と解釈されます。


次回からは、文(ステートメント)や宣言、式などといったものを扱うようになります。


スポンサード リンク

この記事のカテゴリ