[ruby-list:48979] 内部DSLによるパーサジェネレータPitaCCをリリースしました

From: "KISHIMOTO, Makoto" <ksmakoto@...4u.or.jp>
Date: 2012-10-06 08:18:49 UTC
List: ruby-list #48979
きしもとです

内部DSLによるパーサジェネレータPitaCCをリリースしました
https://github.com/metanest/pitacc

サンプルの文法定義の部分から抜粋しますが、

    rules {
        rule :EXPR,        :TERM, :"EXPR'"

        rule :"EXPR'",     :OP1, :EXPR do|op, e|
            @buf << op
        end

        rule :OP1,         :+
        rule :OP1,         :-

        rule :"EXPR'" # ε
(略)
        rule :FACTOR,      :num do|n|
            @buf << n
        end

        rule :FACTOR,      :"(", :EXPR, :")"
    }

こんな感じで、還元アクションをrubyのブロックとして記述すると、
パーサが作れます(正確にはパーサを生成しているのではなく、
表駆動型パーサ用の表を生成しています)。
ハッシュの => を使って、もう少しそれっぽくできそうですが、
ブロックの構文になってしまうようで諦めました。

今のところLL(1)用のジェネレータしか実装していませんので、
LL(1)の文法しか処理できません。

In This Thread

Prev Next