専攻科実験で、「字句解析と構文解析で電卓プログラムを作ろう」というネタを実施中。
サンプルプログラムを見せて、課題の1つが「式を読みやすくするための空白が使えるように改良」としているが、学生さんより、『最初に空白を全部消してから処理するのはアリ?』との質問。
ひとまずは動くプログラムをつくってくれればいいけど….
でも、空白を先に全部消してから、トークン切り出しをやると、色々とトラブルが起こる。
((例1)) x=-1 ; 昔、私が学生の頃に使ったCコンパイラは、"+="演算子を、 "=+"と書いても良かった。だから、"x -= 1"と誤認され、 プログラムがバグった。この経験以降、代入文の"="の前後 とかややこしい演算子の式で、空白を適所に打たないヤツは シロウト判定している。 今回の質問のように、空白を除去してから字句解析を行うと、 "x = -1"と誤認されないように空白を入れあっても、 "x -= 1"に誤認される。 ((例2)) C++でのテンプレートクラスでは、<>の中に型を 書いたりするけど、Foot<int>といった型も 出てくる。んで、<>の中にテンプレートクラス が出てくると、Foo< Bar<int> > といった 型を使う場合がある。でも、空白除去後に字句解析をすると、 Foo<Bar<int>>となり、右シフト演算子になる。 → C++03 から C++11 での仕様の変化 ・C++03までは、テンプレートの">"の前後には空白を入れるべき。 ・C++11からは、"<"のトークンの数で">>"でも区別してくれる。