プログラミングと工作と

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

ただ、素通りしていくだけよ

さてさて、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()関数を作ってエラー表示させようと思っています。

このような、ソースプログラムを受理する「だけ」、文法の間違いがあればエラーを表示する「だけ」の骨組みを、まずは作っていきます。