プログラミングと工作と

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

Python先生さすがっす!

次はCONST_STMTS行きます。
ここが出来れば、VAR_STMTSも出来たようなものです。

6. CONST_STMTS   →  NON_KEY_ID '=' NON_KEY_ID | LIT

def const_stmts(token):
    if token in KEYWORD:
        エラー:予約語が定数名に使われてるよ!
    if next_token() != '=':
        エラー:ここは、「=」がくるところでしょ?
    x = next_token()
    if x in KEYWORD:
        if x != INTEGER:
            if x != '+':
                if x != '-':
                    if x != 'true':
                        if x != 'false':
                            エラー:'='の右側がヘンですよ!
    if x == ('+' or '='):
        next_token()
        if token not in INTEGER:
            エラー:'+','-'のあとには整数がくるはずですよ!
        x = x + token
    if next_token() != ';':
        エラー:';'セミコロンが抜けてませんか?
    if next_token() in KEYWORD:
        if token != 'var':
            if token != 'begin':
                エラー:ここは'var'か'begin'か非キーワードのくるところ!
    if token not in KEYWORD:
        const_stmts(token):


突然KEYWORDとか出しましたが、begin, end, const ... とかの予約語です。
リストにしておけば'in'で予約語集合に含まれているかどうかすぐに判定できます。
Pythonさま様です。
あと、if token not in INTEGER: とか書いていますが、tokenが整数かどうかを判定しています。
しています、ってしれっと書きましたが、実際どういうふうに実装するかはまだ考えていません。Pythonに整数判定のメソッドがあったような気がしますが、調べてみましょう。

・・・一分後
調べました。str.isdigit() で文字列strが数字だけを含むかどうかがわかるようです。
上のスクリプト中で言えば、

  • if x != INTEGER: → if not x.isdigit():
  • if token not in INTEGER:  →  if not token.isdigit():


でいいのではないでしょうか。
Python先生頼りになるっす!