プログラミングと工作と

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

なにはともあれ、まずは文法

最初に、作成する構文解析器の文法を定義します。
定義しますと言ってはいますが、本に定義されたものをトレースしていくのです。
その文法が↓

 1. PROG  →  PROG_STMT  CONSTS  VARS  BEGIN_END STMT
 2. PROG_STMS  →  'program'  NON_KEY_ID  ';'
 3. CONSTS  →  'constCONST_STMTS
                      →  λ
 4. VARS  →  'var'  VAR_STMTS
                 →  λ
 5. BEGIN_END STMT  →  'begin' 'end' '.'
 6. CONST_STMTS  →  NON_KEY_ID '=' NON_KEY_ID | LIT
 7. VAR_STMTS  →  IDS ':' TYPE ';' (VAR_STMTS | λ)
 8. IDS  →  NON_KEY_ID (',' IDS | λ)
 9. TYPE  →  'integer' | 'int'
                 →  'boolean' | 'bool'
10. LIT  →  INTEGER
              →  BOOLEAN
              →  '+' INTEGER
              →  '-' INTEGER
11. BOOLEAN  →  'true'
                          →  'false'
12. INTEGER  →  NUM  NUMS
13. NUMS →  NUM  NUMS
                  →  λ
14. NUM  →   '0' | '1' | '2' |・・・|'8' | '9'

---------------------------------------------------------------------

例えば、1.番の規則

1. PROG  →  PROG_STMT  CONSTS  VARS  BEGIN_END STMT

構文解析するプログラムは、

def prog(token):
    if token != 'program':
        エラー:キーワード'program'がないよ!
    prog_stmt(token)
    if token = 'const':
        consts(token)
    if token = 'var':
        vars(token)
    if token != 'begin':
        エラー:キーワード'begin'がないよ!
    begin_end_stmt(token)
    if token != 'end_of_file':
        エラー:'end.'の後になんか文があるよ!

といった感じです。
文法規則にしたがって、prog_stmt() consts() ・・と関数を呼び出しているだけです。
そのprog_stms()などの関数も、同様に文法規則のままスプリクトに落としていくだけ。
わりと簡単に書けそうです。
今日はそろそろ眠いので、明日から本気出す。