[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)の文法しか処理できません。