ただ、素通りしていくだけよ
さてさて、2番めの文法規則
2. PROG_STMS → 'program' NON_KEY_ID ';'
を書いてみましょう。
def prog_stmt(token):
global token
if token != 'program':
エラー:キーワード'program'がないよ!
next_token()
if token not in NON_KEY_ID:
エラー:プログラム名がないよ!
if next_token() != ';':
エラー:セミコロン';'がないよ!
next_token()
この、prog_stmt()関数が呼ばれる時は、tokenには'program'が入っているはずです。
なぜなら、ソースファイルの一番最初のトークン(program)がtoken変数に入った段階で呼ばれるからです。一番目の文法規則
1. PROG → PROG_STMT CONSTS VARS BEGIN_END STMT
と、そのプログラム表現のprog_stmt()関数が呼ばれる場所を見ればわかると思います。
def prog(token):
global token
if token != 'program':
エラー:キーワード'program'がないよ!
prog_stmt(token) # <=== prog_stmt()関数が呼ばれた!
if token = 'const':
consts(token)
if token = 'var':
vars(token)
if token != 'begin':
エラー:キーワード'begin'がないよ!
begin_end_stmt(token)
if token != 'end_of_file':
エラー:'end.'の後になんか文があるよ!
また、あるはずのキーワード'program'が無いとエラーを出すようにしています。
プログラム中では「エラー:キーワード'program'がないよ!」みたいな日本語で書いていますが、実際にはerror()関数を作ってエラー表示させようと思っています。
このような、ソースプログラムを受理する「だけ」、文法の間違いがあればエラーを表示する「だけ」の骨組みを、まずは作っていきます。