人気ブログランキング |

独自言語仕様のインタプリタを作る

仕事で絡みのある方からの要望もあり、独自言語仕様のインタプリタを作ることにした。

インタプリタとはプログラミング言語の実行形態の一種。それって何?という方はこちらを。
http://www.cuc.ac.jp/~miyata/classes/prg1/02/2way.html

# 仕事の関係もあるので、構築の詳細は記載していません。
# 構築方法の詳細をご希望の方は期待はずれですので、ご了承ください。

いろいろと情報を探すと、インタプリタは字句解析と構文解析からなり、構文解析したものを意味解析(1行ずつプログラムを実行)する仕様が多いのだとか。
そしてなんと、世の中にはこの字句解析と構文解析をしてくれるCやC++のソースを吐き出すlexやyaccというツールも存在するらしい。
その辺りの情報はこちらでどうぞ。

とはいえ、インターネットの情報だけでは心許ないので本を一冊購入した。

こちらはlexやyaccを使うことなく、字句解析や構文解析の基本的な動作を記載した感じ。
今回作る独自言語は仕様をかなり限定的にするので、ツールを使うことなくこの本に記載されているような方法にした。

次に独自言語を開発する言語をどうするかという問題がある。
Windows他、MacOSやLinuxでも動作させるものとして作るならやはりC++なのだろうけど、僕はC++にどうも苦手意識がある。
当面はWindowsでしか使わないので、ここは割り切って最近よく使っているC#で作ることにした。
コンソールで動作するようなプログラムなら、C#でXamarin.Macや、monoを使えば直ぐに他OSで動作させることができるのではないかという目論み。

で、どんな感じの言語かというと、以下の仕様。

#ここから
c1 = "これは文字変数です"
c2 = "この言語は独自仕様言語です"

print c1
print c2

for i = 1 to 10
 for j = 0 to 20 step 2
  if ( i lt 5) then
   print " i はまだ5以下です",i
  end if
  if ( i ge 5) then
   print " i が5以上になりました",i
  end if
  pause
 next
 print " j の値は" , j , "です"
 pause
next
quit
# 先頭文字が # ならその行はコメント
# ここまで

その他、もちろんgotoも実装する。
と、いうより制御構造はgotoとifが実装できれば、forループはその応用で実装できる。
更に、昔懐かしいN88BASICなんて言語にあったgosubを使った関数もgotoで実装することができる。

実際に作り始めて上記の独自言語プログラムを動作させるところまで4日であった。
yacc、lexを使っていないのでかなり強引な部分があり、それ故に特に制御構造のネストに苦労した(なんと購入した本には「ネストは複雑になるので考慮しない」と書かれていた)けど、おそらく実働は2日くらいだと思う。

なんというか、、、Visual Studio 2017が凄いな!
ど素人でもなんとなく作れてしまう。

今後は、目標とする「大量にデータを作成して大量に計算を実行するインタプリタ」の為に、既に実装経験がある機能をひとつ一つ追加していく。

あッ、そうそう配列変数も実装する。