なにはともあれ、まずは文法
最初に、作成する構文解析器の文法を定義します。
定義しますと言ってはいますが、本に定義されたものをトレースしていくのです。
その文法が↓
1. PROG → PROG_STMT CONSTS VARS BEGIN_END STMT
2. PROG_STMS → 'program' NON_KEY_ID ';'
3. CONSTS → 'const' CONST_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()などの関数も、同様に文法規則のままスプリクトに落としていくだけ。
わりと簡単に書けそうです。
今日はそろそろ眠いので、明日から本気出す。