3-3. ちょっと寄り道ー構文解析の話(オプショナル)

現在までの処理系には、ミニOCaml言語プログラムの構文解析を行ってくれる部分がないので、 たとえば、if 2=1 then 1*2 else 1*(2+3) という式を、
If (Eq(IntLit 2, IntLit 1),
    Times(IntLit 1, IntLit 2),
    Times(IntLit 1, Plus(IntLit 2,IntLit 3)))
というように exp型の式として書かなくてはならず、入力が大変であり、間違いやすい。 もし、
parse "if 2=1 then 1*2 else 1*(2+3)" 
とすると、上記のexp型の式を生成してくれる関数parseがあれば、大変に便利 である。

ここで、「構文解析する」という言葉を使ってきたが、正確には以下の2つの プログラムから構成される。

  1. 字句解析器 (lexer)..入力文字列を、トークンとよばれるもの(「単語」 に相当するもの)の列にする。
  2. 構文解析器 (parser)..トークン列を、構文の定義に応じた木(構文木)に する。
一般にlexerやparserを最初から書くのは大変であるが、 今日では、文法などのルールを一定の書式で記述すれば、 lexer,parser を生成してくれる、という便利なプログラムがあるので それを使えばよい。C言語用のそれは lex, yacc という名称であり、 OCaml でもそれに対応して、ocamllex, ocamlyacc というプログラムがある。 ここではそれを使う。

ミニOCaml言語に対応した定義ファイル

ocamllex, ocamlyacc の具体的な使い方は、OCaml の本家のウェブページの記 述を参考にしてほしい。ここでは、ミニOCaml言語用の定義ファイルを説明な しに与える。

発展課題 (オプショナル)


トップ, 前へ, 次へ.

亀山 幸義