ホーム » スタッフ » 斉藤徹 » 実験(斉藤) » 電卓プログラム作成の補足

2017年11月
« 10月   12月 »
 1234
567891011
12131415161718
19202122232425
2627282930  

最近の投稿(電子情報)

アーカイブ

カテゴリー

電卓プログラム作成の補足

専攻科実験で、「字句解析と構文解析で電卓プログラムを作ろう」というネタを実施中。

サンプルプログラムを見せて、課題の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からは、"<"のトークンの数で">>"でも区別してくれる。