プログラミングと工作と

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

エラー・・・だと・・・

さて、前回つくったtoken関数と、next_char関数を合わせて、下のファイルを作ってみました。

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

def error():
    print('error')


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

def next_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()


error関数は、とりあえず「error」って言うだけの手抜きw
まあ、動作確認が目的だからと言い訳しつつ、実行したのが下・・・

~/PasAvr$ python tokentest1.py
Traceback (most recent call last):
   File "tokentest1.py", line 46, in <module>
     token = next_token()
   File "blogtest2.py", line 20, in next_token
     if char in spechar:
UnboundLocalError: local variable 'char' referenced before assignment



・・・エラー・・・だと・・・

なになに、ローカル変数「char」を定義する前に参照している?

あれ?

最初に「char = ''」って宣言してるんですけど?だめなの?