いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

インタプリタを作る(4)字句解析とは何か

 コロナ騒ぎもどうにか収まりつつあり、世の中が動き出しました。図書館も机は使えなくなっていて行っても勉強できず落ち着きませんが、本は借りられます。仕事も再開。この3ヶ月、それなりに勉強はしたけれど刺激がないのが辛かったです。学生はみんなかわいそうですが中学も高校も大学生も特に新1年は気の毒です。新しい学校生活が始まって「よし、頑張って楽しい学校生活を送るんだ!」と希望に燃えているはずのところでコロナ。災害です……。

 コンピュータ言語を作り始めました。Pythonで書いています。だからできあがり予定の言語は実行速度では期待できない部分もありすが、そういうことではありません。原理をはっきりさせ、あとで見てパッと復習もできるようにまとめる目的です。フルスクラッチで行きます。つまり、lex(字句解析プログラムのソースを作るプログラム)などには頼らず、100%自分で書きます。

 今回の記事のタイトルにある「字句解析」というのはソースコードトークンに分ける作業のことです。例えば

f:id:Inuosann:20200613201340p:plain

は仮想のコンピュータ言語のソースコードですが、1+2+……+99を求める目的のプログラムです。最初の「s」はトークン(字句)です。「=」も「0」もトークン。「100」も「while」もそうです。要するにソースコードの一部であって、意味を持つ最小単位のことをトークンと呼ぶのです。プログラミング言語で書かれたソースを読み、そのソースに書かれたことを実行するのがプログラミング言語の処理系です。今、この処理系を作り始めたということです。例えばいわゆるPythonPythonという言語で書かれたソースを実行する処理系です。

 上の例では「s」は変数、「=」は変数に数値を代入する働きがあり、「0」は数値。「while」は繰り返しの作業を指示し、「<」は数値の大小を判定する働きを持ちます。トークンにはこうした様々の種類があります。言語の処理系はまずソースを読んだらそのソースを分析して、「この部分は変数、こちらのここは比較のための記号、あちらは……」とトークンに分けなければなりません。今、字句解析するコードをある程度まで書いたところです。いったんできあがったら、ソースをきれいに整理してブログに載せる予定です。

 やはり、実験室レベルでよい、とにかく自分である程度のことをできるプログラムを書いてみることだと思います。いろいろなことが分かり、自分の言葉で議論することができるようになるでしょう。この分野だけではない、普遍的な真理だという気がします。