Perl6のgrammarが凄い件について 〜残パン会で発表してきた〜

残パン会とは

残念な言語で残念なものを、残念パンをもそもそしながら新聞紙引いた残念な場所で適当に書く。

Perl6とは

Perlのようなもの」
とか言われてる、Perl5とは別物。らしい←本人Perl5知らない。

Perl6の特徴とか

  • PerlなのにClojureとかclassとかある。キモい。
  • しかしPerlなので変数名の頭に$@とか付く。超キモい
  • $fileが例えばファイルオブジェクトだとすると、$file.linesはリストオブジェクトになるくせに@で始まらないので何かおかしい
  • $とか@とかの所為で、動的型付け言語なのに自由度が制限されてる気がする
  • ねこ演算子 1^..^8 => [2, 3, 4, 5, 6, 7]

grammarとは

yaccの構文みたいに書けばパーサ作れるよ!
私が色々書くよりこっちの方がいいんじゃないかな。
http://d.hatena.ne.jp/osanine/20101217/1292597385

yaccとの違いの最大のところは、正規表現が使える点

作ったもの

数式をパースしてるだけ。

grammar CalcExp {
    token num { \d+ }
    token op { '**' | '+' | '-' | '*' | '/' }
    rule value { <exp> | <num> }
    rule exp { '(' <value> <op> <value> ')' }
    rule TOP { ^ <value> $ }
}

class Calc {
    method num($/) { make eval $/.Str }
    method exp($/) {
        given $<op> {
            when '**' { make $<value>[0].ast ** $<value>[1].ast }
            when '+' { make $<value>[0].ast + $<value>[1].ast }
            when '-' { make $<value>[0].ast - $<value>[1].ast }
            when '*' { make $<value>[0].ast * $<value>[1].ast }
            when '/' { make $<value>[0].ast / $<value>[1].ast }
        }
    }
    method TOP($/) { make $<value>.ast }
    method value($/) { make $/.values[0].ast }
}

my $s = "(2**(1+3))";
my $m = CalcExp.parse($s, actions=>Calc);
say $m.ast;

括弧外せるようにしたかったが

何かできんかった