Hatena::ブログ(Diary)

ぱたヘネ

2018-06-05

[]Writing Compilers and Interpreters: その9

chap6が終了。制御構造とか何にもないけど、変数の代入ができるようになった。

ふと気が付いたんだけど、定数の畳み込みの最適化って、実際にはインタプリタの実装と同じだ。

変数のスコープ、演算子の優先順序、型変換等、言語仕様にそって動く物がないと、最適化前、後で結果が変わってしまう。

整数浮動小数点数演算や、浮動小数点数同士の演算の順序とか、想像していたよりシビアで意外に最適化むつかしいなと気が付いた。

2018-06-03

[]Writing Compilers and Interpreters: その8

手書きパーサー作成中。

BEGIN
    BEGIN {Temperature conversions.}
        five  := 3;
    END;
END.

これのパース結果をxmlで出力できるようになった。こんな単純なのだと良いけど、これから複雑になってきたときにxmlで良いのかは良く分からない。

<COMPOUND line="1">
    <COMPOUND line="2">
        <ASSIGN line="3">
            <VARIABLE id="five" level="0" >
            <INTEGER_CONSTANT value="3" >
        </ASSIGN>
    </COMPOUND>
</COMPOUND>

あとは少しずつパスカルのソースを複雑にしていく。

2018-06-01

[]Writing Compilers and Interpreters: その7

手書きパーサーを作成中。

このPascalコードをパースして、

BEGIN
    BEGIN {Temperature conversions.}
        five  := 3;
    END;
END.

fiveを代入先の識別子として認識するところまで来ました。

====== CROSS-REFERENCE TABLE ======

Identifier        Line numbers   
----------        ----------- 
five            003 
0 instructions generated

もうちょっと大きいPascalコードをパースさせると無限ループする。

デバッグする前に、パースした結果の構文ツリーがちゃんとできているか確認したい。

ちょっとしたことでもブログに書いていかないと、仕事が忙しくなるとモチベーションが消えそう。

2018-05-24

[]Writing Compilers and Interpreters: その6

シンボルテーブルを作りました。

この本にでてくるのは、スタック型のデータ構造でシンボルを管理しています。ツリーで全部作りきった方が良さそうな気がするのですが、パースしながらネストに沿ってスタックを伸ばしたり縮めたりするようです。ネストの処理は9章でやるようです。

f:id:natsutan:20180524112059p:image

このソースコードに対して、シンボルテーブルが出力できるようになりました。

====== CROSS-REFERENCE TABLE ======

Identifier        Line numbers   
----------        ----------- 
abs             031 033 
epsilon         004 033 
input           001 
integer         007 
newton          001 
number          007 014 016 017 019 023 024 029 033 035 
output          001 
read            014 
real            008 
root            008 027 029 029 029 030 031 033 
sqr             033 
sqroot          008 023 024 031 031 
sqrt            023 
write           013 
writeln         012 017 020 024 025 030 
0 instructions generated

2018-05-23

[]Writing Compilers and Interpreters: その5

とりあえず3章まで終了してトーカナイザーができた。正直この辺までは僕の人生で10回くらいやってる。

パーサーを突破したのが2回くらい。

4章はシンボルテーブル。Cで書くと辛い奴だが、今時の言語なら余裕だと思う。

順調だけど油断せずに行こう。