プログラミングと工作と

PythonとかPascalとかAVRマイコンとか、コンパイラつくったり電子工作なんかを楽しんでいるおっさんの記録

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$

とか、間違えたところで止まってエラー表示をだすので分かりやすいですよね。