Pythonで改行なし文字出力の方法を覚えた。
昨日のプログラムですが、ひとつ覚えたので忘れないうちにメモしときます。
今まで、構文解析中に、読み込んだソースプログラムのtokenを表示していたのですが、print()文は、表示後自動的に改行するのでtokenが一行にひとつづつズラッと表示されていた。
出来ればソースプログラム通りに表示したほうが分かりやすいよなー、っと思っていたのですが、やり方がよくわからなかった。
改行なしで表示が出来れば、というか読み込んだ通りに表示していけばソース通りの表示になるはずですよね。
で、調べたところ3種類の方法を発見した。
1.print"string”,
−表示文字のあとにコンマ','を入れる(Python2の方法)
2.print("string", end = "")
−上の様に「end=""」を入れる(Python3の方法)
3.import sys でsysを読み込み
sys.stdout.write("string") で出力
1,2の方法は、Pythonのバージョンに依存するのでちょっと使いたくないなー、ということで、3の方法でやってみます。
ファイルから一文字取得するメソッド「next_char()」に入れてみた
import sys
def next_char(self):
self.char = self.infile.read(1)
#print(char)
if not self.char: #EOFなら(file.read()は、EOFを検出すると空を返す)
self.char = 'end_of_file'
return self.char
else:
sys.stdout.write(self.char) #←ここ!
return self.char
で、実行結果が↓
~/PasAvr$ python parser02.py
program test;
const
yes = true;
no = false;
small = 0;
big = 123456;
var
id1 : integer;
id2 : boolean;
hen : integer;
x, y, z : int;
begin
end.
正常終了
~/PasAvr$
ちゃんとソースプログラムの通り出力しています。
これで、エラー表示もソースのエラー部分で出るのでわかりやすくなりますね。
例えば
~/PasAvr$ python parser02.py
program test;
const
yes = true;
no = false;
small = 0
big
Error8 ';'セミコロンが抜けていませんか?
***プログラムを停止します***
~/PasAvr$
とか
~/PasAvr$ python parser02.py
program test;
const
yes = true;
no = false;
small = 0;
big = 123456;
var
id1 : integer;
true
Error9 ここは'begin'か非キーワードのくるところ!
***プログラムを停止します***
~/PasAvr$
とか、間違えたところで止まってエラー表示をだすので分かりやすいですよね。