be-kan's blog

今しかできない勉強をする。

「やさしい コンパイラの作り方 入門」 のコンパイラをちょっと直した

以下のコンパイラ自作本を本に、trifleという小さな言語のコンパイラを半自作しました。
やさしいコンパイラの作り方入門


私のGitHubにそのソースコードをあげています。
github.com


簡単に説明すると、
trifleという仮想の小さな言語を想定し、それをコンパイルするようなコンパイラC++で書いています。
trifleはコンパイルされるとニーモニックを生成し、そのニーモニックを実行する仮想環境をC++で構築して実行しています。
この仮想環境が少し特殊で、スタック構造の記憶階層のあるチューリングマシンのような動きをします。(多分)


ここで、バグっぽいものに遭遇したのでメモ程度に書いておきます。
(本当にすごい先人達が作ったサンプルのはずなので、僕の間違いの可能性が高いですが、同じような状況に陥っている人がもしいるとしたらその人のためにと思って)

compile.cppの中の405行目、
statementの中でLBrace('{'のこと)を見つけ、その中でさらにstatementを見つけた後、Semicolonを見つけるとbreakしてしまっているんです。意味的に考えてもここはbreakではなくcontinueなのではないかなぁと思います。Semicolonを見つけてもwhileループは出るべきではなく、RBrace('}'のこと)を見つけた時初めてループをstatementを出るのが良いではないのかぁ、と思ったり。

実際、サンプルコードはセミコロンが付いていたり付いていなかったりしていたので、行の終わりとRBraceの後には必ずSemicolonをつけるような言語設計にすれば、全てのサンプル実装で正しくコンパイルできます。