Go
GoDay 7

Go言語でプログラミング言語を作るための字句解析・構文解析

More than 5 years have passed since last update.

さて、プログラミング言語を作ろうとしたさいに、出来るだけローレベルな言語を使うことはあるかと思います。例えば、C、C++、OCaml、Haskellなど、そのあたりがプログラミング言語を作るためのプログラミング言語として採用することが多いかと思われます。さて、Go languageも、バイナリに変換出来ますし、その上gorutineという並列処理が言語仕様として入ってます。したがって、Goでプログラミング言語、書くっきゃないね!


プログラミング言語とはそもそも何か

とはいえ、いきなり言われても、「プログラミング言語ってそもそも何ですか」みたいな話になるかと思われます。もちろん、このあたりについては実装によって変わってくるのかもしれませんが、基本的には三つの過程を経ています。


  • 字句解析

  • 構文解析

  • 意味解析

今回は、この上二つ、字句解析と構文解析についてのメモ書きを公開します。


字句解析

コンピューターにとって、そもそも文字の並びがどのようなものとして解釈するべきなのか、というのは自明なものではありません。例えば、プログラミング言語をさわっていると、つい100の数字の並びを「数字」として表現しているように捉えるかもしれませんが、しかし実際は、この数字の並びは「数字」であるということを教えてあげなければなりません。

Goの標準パッケージには、実際のところ、このような字句解析を行うパッケージは含まれています。有名なところだと下の二つです。

確かに、Goの中で完結させるとするならば、これらのパッケージを使う選択は正しいと思う一方で、しかし字句解析のコードを一から書いていくのは、それなりの労力が必要となります。

そこで、Goに対応している字句解析生成ツールとして、Ragelというものが存在しています。


構文解析

字句解析、つまりそれぞれの文字の並びが何を表しているのかを解析したあとに、その並びがどのような意味と出来るのか、ということを解析する必要があります。例えばvar foobar = 1だとするならば、これは「foobarに1を代入する」という意味として形式化する必要があるでしょう。

さて、このような構文解析を作るさいに、yaccというコンパイラ(Yat Another Compiler Compilerの略らしい)というのを利用することがほとんどですが、Goには既にtoolとして、yaccが利用できたりします。


おまけ

しかし、このように書いたとしても、なんらかのサンプルがないと、実際にどういう風に書いたらいいかわからないでしょう。そこで、作りかけではありますが、自分が上記を利用して作ったPeridというレポジトリを見て頂ければ、どういう感じで作れるのかがわかるかと思います。

Go langで実装されたLightweight Languageが出ることを非常に楽しみにしています。