kmyacc

『Rubyを256倍使うための本 無道編』の 13.defun/intp.y を移植(Perl 版)

関数定義可能。変数スコープあり。コードを理解できていないので、意味(動作)から推測(IntpFrame クラスはなし) %{ use Data::Dumper; package Node; sub new { my $class = shift; bless {}, $class; } sub exec_list { my $self = shift; my ($nodes) = @_…

『Rubyを256倍使うための本 無道編』の 13.defun/intp.y を移植(Perl 版)

関数定義可能に。ただし、変数スコープなし、グローバル %{ use Data::Dumper; package Node; sub new { my $class = shift; bless {}, $class; } sub exec_list { my $self = shift; my ($nodes) = @_; foreach my $i (@$nodes) { $i->evaluate(); } } pack…

『Rubyを256倍使うための本 無道編』の 12.if_while/intp.y を移植(Perl 版)

%{ use Data::Dumper; package Node; sub new { my $class = shift; bless {}, $class; } sub exec_list { my $self = shift; my ($nodes) = @_; foreach my $i (@$nodes) { $i->evaluate(); } } package RootNode; @ISA = qw(Node); sub new { my $class = …

『Rubyを256倍使うための本 無道編』の 11.op_ok/intp.y を移植(Perl 版)

四則演算ができるように %{ %} %token IDENT NUMBER STRING %left '+' '-' %left '*' '/' %left UMINUS %% program : | program stmt '\n' { $lineno++; } | program '\n' { $lineno++; } ; stmt : expr | assign | IDENT realprim { stmt = do_funcall(IDEN…

『Rubyを256倍使うための本 無道編』の 09.errmsg/intp.y を移植(Perl 版)

%{ %} %token IDENT NUMBER STRING %% program : | program stmt '\n' { $lineno++; } | program '\n' { $lineno++; } ; stmt : primary | assign | IDENT args { stmt = do_funcall(IDENT, args); } ; funcall : IDENT '(' args ')' { funcall = do_funcall…

『Rubyを256倍使うための本 無道編』の 08.noarg/intp.y を移植(Perl 版)

未知変数は引数のない関数呼び出しと解釈 %{ %} %token IDENT NUMBER STRING %% program : | program stmt '\n' ; stmt : primary | assign | IDENT args { stmt = do_funcall(IDENT, args); } ; funcall : IDENT '(' args ')' { funcall = do_funcall(IDENT…

『Rubyを256倍使うための本 無道編』の 07.parenomit/intp.y を移植(Perl 版)

括弧なし関数呼び出し %{ %} %token IDENT NUMBER STRING %% program : | program stmt '\n' ; stmt : funcall | assign | IDENT args { stmt = do_funcall(IDENT, args); } ; funcall : IDENT '(' args ')' { funcall = do_funcall(IDENT, args); } | IDENT…

『Rubyを256倍使うための本 無道編』の 03.func/intp.y を移植(Perl 版)

%{ %} %token IDENT NUMBER STRING %% program : | program stmt '\n' ; stmt : funcall | assign ; funcall : IDENT '(' args ')' { funcall = do_funcall(IDENT, args); } | IDENT '(' ')' { funcall = do_funcall(IDENT, []); } ; a1@args : primary { a1…

『Rubyを256倍使うための本 無道編』の 01.first/intp.y を移植(Perl 版)

%{ %} %token IDENT NUMBER STRING %% program : | program stmt '\n' ; stmt : funcall | assign ; funcall : IDENT '(' args ')' { funcall = do_funcall(IDENT, args); } | IDENT '(' ')' { funcall = do_funcall(IDENT, []); } ; a1@args : primary { a1…