バグバグしてるんですけど
気を取り直して、ローカル変数とグローバル変数について調べてみた。
グローバル変数は、ローカルな関数内で「global」で宣言しなければならない、だって!?グローバルで一度宣言するPascalとかとは違うんだ!
なんだよPython、めんどくさいじゃないか。
まあ、グローバル変数なんか使うんじゃねぇ!ってことなのかもしれないけど。
トークンは、この後あらゆる関数内で使われる変数だからなー
このへんうまくやれるプログラム技術とかあるんだろうな。なに勉強すればいいんだろう?
とりあえず、グローバル変数宣言したのが下のスクリプト
#!/usr/bin/python
# coding: utf-8
def error():
print('error')
def next_char():
global char
char = infile.read(1)
if not char: #EOFなら(file.read()は、EOFを検出すると空を返す)
char = 'end_of_file'
return char
return char
def next_token():
global char, token
token = ''
while token == '':
if char in spechar:
token = char
char = next_char()
elif char in letter:
token = char
char = next_char()
while char in (letter + digit):
token = token + char
char = next_char()
elif char in digit:
token = char
char = next_char()
while char in digit:
token = token + char
char = next_char()
elif char in ['\r', '\n', '\t', ' ']:
char = next_char()
elif char == 'end_of_file':
token = 'end_of_file'
else:
error()
return token
char = ''
infile = open('test.p', 'r')
while 1:
token = next_token()
if token == 'end_of_file':
print('EndOfFile')
break
print(token)
infile.close()
実行したら↓
~/PasAvr$ python tokentest1.py
Traceback (most recent call last):
File "tokentest1.py", line 57, in <module>
token = next_token()
File "tokentest1.py", line 21, in next_token
if char in spechar:
NameError: global name 'spechar' is not defined
あ、specharとかletterとか、定義するの忘れてた。
追加して見たよ↓
#!/usr/bin/python
# coding: utf-8
def error():
print('error')
def next_char():
global char
char = infile.read(1)
if not char: #EOFなら(file.read()は、EOFを検出すると空を返す)
char = 'end_of_file'
return char
return char
def next_token():
global char, token
token = ''
while token == '':
if char in spechar:
token = char
char = next_char()
elif char in letter:
token = char
char = next_char()
while char in (letter + digit):
token = token + char
char = next_char()
elif char in digit:
token = char
char = next_char()
while char in digit:
token = token + char
char = next_char()
elif char in ['\r', '\n', '\t', ' ']:
char = next_char()
elif char == 'end_of_file':
token = 'end_of_file'
else:
error()
return token
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 = [':', ',', ';', '.','=', '+', '-', '<', '>', '(', ')']
char = ''
infile = open('test.p', 'r')
while 1:
token = next_token()
if token == 'end_of_file':
print('EndOfFile')
break
print(token)
infile.close()
さあ!実行してみよう!
・
・
・
・
・
・
・
error
error
error
error
error
error
error
error
error
error
error
error
error^C
Traceback (most recent call last):
File "tokentest1.py", line 58, in <module>
token = next_token()
File "tokentest1.py", line 41, in next_token
error()
File "tokentest1.py", line 5, in error
print('error')
KeyboardInterrupt
えっと・・・無限ループに陥っているんですけど・・・