プログラミングと工作と

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

ひとつのファイルにくっつけてみた

全部くっつけたらこうなった。

#!/usr/bin/python
# coding: utf-8

def error(err):
    if err == 1:
        e = u" 突然ファイルの終端になっています"
    elif err == 2:
        e = u" }はトークンの始まりには出来ません"
    elif err == 3:
        e = u" 誤った記号が使用されています"
    elif err == 4:
        e = u" 予約語が変数名に使われてるよ!"
    elif err == 5:
        e = u" ここは','か':'がくるところでは?"
    elif err == 6:
        e = u" ':'コロンが抜けてませんか?"
    elif err == 7:
        e = u" 型名が間違ってませんか?"
    elif err == 8:
        e = u" ';'セミコロンが抜けていませんか?"
    elif err == 9:
        e = u" ここは'begin'か非キーワードのくるところ!"
    elif err == 10:
        e = u" 予約語が定数名に使われてるよ!"
    elif err == 11:
        e = u" ここは、「=」がくるところでしょ?"
    elif err == 12:
        e = u" '='の右側がヘンですよ!"
    elif err == 13:
        e = u" '+','-'のあとには整数がくるはずですよ!"
    elif err == 14:
        e = u" ここは'var'か'begin'か非キーワードのくるところ!"
    elif err == 15:
        e = u" キーワード'begin'がないよ!"
    elif err == 16:
        e = u" キーワード'end'がないよ!"
    elif err == 17:
        e = u" ピリオド'.'がないよ!"
    elif err == 18:
        e = u" キーワード'const'がないよ!"
    elif err == 19:
        e = u" キーワード'var'がないよ!"
    elif err == 20:
        e = u" キーワード'program'がないよ!"
    elif err == 21:
        e = u" プログラム名がないよ!"
    elif err == 22:
        e = u" 'end.'の後になんか文があるよ!"
    elif err == 4:
        e = u" 予約語が変数名に使われてるよ!"
    elif err == 4:
        e = u" 予約語が変数名に使われてるよ!"

    infile.close()    
    print('Error' + str(err) + e)
    input()


def next_char():
    global char    
    char = infile.read(1)
    #print(char)
    if not char:   #EOFなら(file.read()は、EOFを検出すると空を返す)
        char = 'end_of_file'
        return char
    else:
        return char


def next_token():
    global char, token
    token = ''
    while token == '':
        if char == '{':                    #トークンが{の場合
            while char != '}':             # }まで読み飛ばす(コメント処理)
                if char == 'end_of_file':  #コメントの途中でEOFになったら
                    error(1)               #エラーを出す
                else:
                    next_char()
            next_char()
        elif char == '}':  #トークンの頭に}は来ないので
            error(2)       #エラーを出す
        elif char == '#':  # #が来たら改行まで読み飛ばす(一行コメント処理)
            while char != '\n':
                if char == 'end_of_file':
                    error(1)
                else:
                    next_char()
        elif char in spechar:  #「記号」の処理
            token = char
            next_char()
        elif char in letter:   #文字列の処理
            token = char
            next_char()
            while char in (letter + digit):
                token = token + char
                next_char()
        elif char in digit:  #数列の処理
            token = char
            next_char()
            while char in digit:
                token = token + char
                next_char()
        elif char in [' ', '\n', '\t', '\r']:  #スペース,改行,タブ,リターンは
            next_char()                        #読み飛ばす
        elif char == 'end_of_file': #EOFの処理
            token = 'end_of_file'
        else:
            error(3)
    print(token)
    return token


def ids():
    global token
    temp = token
    if token in keyword:
        error(4)
    if next_token() not in [',', ':']:
        error(5)
    while token == ',':
        if next_token() in keyword:
            error(4)
        temp = temp + ',' + token
        next_token()
    return temp


def var_stmts():
    global token
    if token in keyword:
        error(4)
    ids()
    if token != ':':
        error(6)
    if next_token() not in ['int', 'integer', 'bool', 'boolean']:
        error(7)
    if next_token() != ';':
        error(8)
    if next_token() != 'begin':
        if token in keyword:
            error(9)
    if token not in keyword:
        var_stmts()
        
        
def const_stmts():
    global token
    if token in keyword:
        error(10)
    if next_token() != '=':
        error(11)
    x = next_token()
    if x in keyword:
        if not x.isdigit():
            if x != '+':
                if x != '-':
                    if x != 'true':
                        if x != 'false':
                            error(12)
    if x == ('+' or '-'):
        next_token()
        if not token.isdigit:
            error(13)
        x = x + token
    if next_token() != ';':
        error(8)
    if next_token() in keyword:
        if token != 'var':
            if token != 'begin':
                error(14)
    if token not in keyword:
        const_stmts()


def begin_end_stmt():
    global token
    if token != 'begin':
        error(15)
    if next_token() != 'end':
        error(16)
    if next_token() != '.':
        error(17)
    next_token()


def consts():
    global token
    if token != 'const':
        error(18)
    if next_token() in keyword:
        error(10)
    const_stmts()
    

def vars():
    global token
    if token != 'var':
        error(19)
    if next_token() in keyword:
        error(4)
    var_stmts()


def prog_stmt():
    global token
    if token != 'program':
        error(20)
    next_token()
    if token in keyword:
        error(21)
    if next_token() != ';':
        error(8)
    next_token()


def prog():
    global token
    if token != 'program':
        error(20)
    prog_stmt()
    if token == 'const':
        consts()
    if token == 'var':
        vars()
    if token != 'begin':
        error(15)
    begin_end_stmt()
    if token != 'end_of_file':
        error(22)
    print(u'正常終了')


def parser():
    next_char()
    if next_token() != 'program':
        error(20)
    prog()


digit = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
letter = ['A','B','C','D','E','F','G','H','I','J','K','L','M',
          'N','O','P','Q','R','S','T','U','V','W','X','Y','Z','_',
          'a','b','c','d','e','f','g','h','i','j','k','l','m',
          'n','o','p','q','r','s','t','u','v','w','x','y','z']
spechar = [':', ',', ';', '.','=', '+', '-', '<', '>', '(', ')']
keyword = ['program','const','var','int','integer','bool','boolean',
           'begin','end','true','false']


infile = open('test.p', 'r')
parser()
infile.close()


・・・ながいね
さりげなく’出来ました’なんて書いていますがまともに動作するのに貴重な土日を消費してしまいました。
いつものごとくしょうもないミスをしていたのですが、しょうもなさすぎて逆に気づきにくいってこともあるんですよね。
実行結果は明日載せます。