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先生頼りになるっす!