プログラミングと工作と

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

バグバグしてるんですけど

気を取り直して、ローカル変数とグローバル変数について調べてみた。
グローバル変数は、ローカルな関数内で「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

えっと・・・無限ループに陥っているんですけど・・・