ひとつのファイルにくっつけてみた
全部くっつけたらこうなった。
#!/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()
・・・ながいね
さりげなく’出来ました’なんて書いていますがまともに動作するのに貴重な土日を消費してしまいました。
いつものごとくしょうもないミスをしていたのですが、しょうもなさすぎて逆に気づきにくいってこともあるんですよね。
実行結果は明日載せます。