まずは、ソースファイルの読み込みから
さて、コンパイラを作るって何から始めよう?
いろいろコンパイラの本を立ち読みしまくったんですが、理論よりのものが多く
て頭が不自由気味の僕には良く理解できない。
神田の神保町まで足を伸ばして古本を漁っていたら、見つけました。
「コンパイラの設計と構築」 Pyster著 松尾正信訳 近代科学社
なんと1983年の本です。
生意気に3千円近くしたのですが、ものすごく実装よりの内容で、実際にPascalもどきのコンパイラを作成しながら説明を進めています。
さらに、最近あまり見なくなったハードカバーの本に威厳のようなものを感じます。
カッコイイ・・・
これをパク参考にすればうまく行きそうな予感がします。
で、難しい事は後回しにして、とりあえずソースファイルを読み込むところから作り始めましょう。
ものすごくお世話になっているPyhon公式サイト
の日本語ドキュメントを探していたら見つけました。
#!/usr/bin/python
# coding: utf-8
def next_char():
return infile.read(1)
・・・こんだけ?
.read(1)で1文字(1バイト)づつ読み込むそうです。
さっそく試してみます。
#!/usr/bin/python
# coding: utf-8
def next_char():
return infile.read(1)
infile = open('test.p', 'r')
while 1:
ch = next_char()
if not ch: #EOFの場合(file.read()は、EOFを検出すると空を返す)
print('EndOfFile')
break
print(ch)
infile.close()
open('ファイル名', 'r')でファイルを開きます。簡単ですね。
'r'はリードオンリーで開きますよって意味らしいのですが、デフォルトで'r'になるらしいので今回は入れる必要はないですね。
test.pに以下の適当なテキストを書いてみました。
program Pa;
var
id1 : integer;
hen : boolean;
begin
end.
実行した結果が以下
p
r
o
g
r
a
m
P
a
;
v
a
r
i
d
1
:
i
n
t
e
g
e
r
;
h
e
n
:
b
o
o
l
e
a
n
;
b
e
g
i
n
e
n
d
.
EndOfFile
おー!
ちゃんと動いているようですね。
End Of File もちゃんと認識できました。
スペースとかタブとか改行文字とかも読んでるからへんな空間がありますが、そのへんの読み飛ばしは次のレベルで処理しよう。
まずは、出だしは好調、と。