最近のトラックバック

2019年5月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

« 【再掲】サンプルプログラムを公開しました | トップページ | SRFI-67(比較手続き)サポート »

形式文法によるパーサを生成する

「形式文法を用いてパーサを生成する」機能をつけました。
yaccやlexの機能をコード生成でなくオブジェクトにしたというようなイメージです。
この機能により、ドメイン特化言語(DSL)等を容易に記述することができます。
文法のクラスはLALR(1)です。

例えば、
S → S + T
S → S - T
S → T
T → T * F
T → T / F
T → F
F → lparen S rparen
F → num
のような文法があったとき、次のようにしてパーサを生成できます。
  (make-grammar
    `((S (S + T)           ,(lambda (t1 x t2) (+ t1 t2)))
      (S (S - T)           ,(lambda (t1 x t2) (- t1 t2)))
      (S (T)               ,(lambda (t1) t1))
      (T (T * F)           ,(lambda (f1 x f2) (* f1 f2)))
      (T (T / F)           ,(lambda (f1 x f2) (* f1 f2)))
      (T (F)               ,(lambda (f1) f1))
      (F (lparen S rparen) ,(lambda (x s1 y) s1))
      (F (num)             ,(lambda (v1) (string->number v1)))))

字句解析器(lexer)は終端記号のシンボルとセマンティクスな解析結果の2値を返す手続きとしています。

« 【再掲】サンプルプログラムを公開しました | トップページ | SRFI-67(比較手続き)サポート »

Scheme」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 形式文法によるパーサを生成する:

« 【再掲】サンプルプログラムを公開しました | トップページ | SRFI-67(比較手続き)サポート »