From 38ec22341cbc08f974963e5fff54f2f2298174a5 Mon Sep 17 00:00:00 2001 From: Luis Mochan Date: Wed, 15 Dec 2021 11:47:39 -0600 Subject: Add try/catch to survive mistakes and rename variables --- challenge-143/wlmb/perl/ch-1.pl | 56 +++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/challenge-143/wlmb/perl/ch-1.pl b/challenge-143/wlmb/perl/ch-1.pl index cc18d4ac91..96c3f72081 100755 --- a/challenge-143/wlmb/perl/ch-1.pl +++ b/challenge-143/wlmb/perl/ch-1.pl @@ -6,33 +6,41 @@ use v5.12; use warnings; use Scalar::Util qw(looks_like_number); +use Try::Tiny; my $original_string; +my $previous; my $current; -my $next; +my $token; foreach (@ARGV){ - my $original_string=$current=$_; - token(); - my $result=expression(); - say "$original_string=$result"; + try { + $original_string=$previous=$current=$_; + token(); + my $result=expression(); + say "$original_string=$result"; + } + catch { + warn $_; + }; } sub token { - $next=[$1,$1], return if $current=~s{^\s*([()*/+-])}{}; # symbol - $next=['N',$1], return + $previous=$current; + $token=[$1,$1], return if $current=~s{^\s*([()*/+-])}{}; # symbol + $token=['N',$1], return if $current=~s{^\s*([^()*/+\-\t\n ]*)}{} and looks_like_number($1); # number? - $next=[undef,undef], return if $current=~/^\s*$/; # nothing - die "Unrecognizable input: $current"; + $token=[undef,undef], return if $current=~/^\s*$/; # nothing + die "Unrecognizable input: $previous\n"; } sub expression { my $result=term(); while(1){ - my $op=$next->[0]; - last unless defined $op && $op=~m{[+-]}; - token(); - $result+=term(),next if $op eq '+'; - $result-=term(),next if $op eq '-'; + my $op=$token->[0]; + last unless defined $op && $op=~m{[+-]}; + token(); + $result+=term(),next if $op eq '+'; + $result-=term(),next if $op eq '-'; } return $result; } @@ -40,24 +48,24 @@ sub expression { sub term { my $result=simple(); while(1){ - my $op=$next->[0]; - last unless defined $op && $op=~m{[*/]}; - token(); - $result*=simple(),next if $op eq '*'; - $result/=simple(),next if $op eq '/'; + my $op=$token->[0]; + last unless defined $op && $op=~m{[*/]}; + token(); + $result*=simple(),next if $op eq '*'; + $result/=simple(),next if $op eq '/'; } return $result; } sub simple { - my $op=$next->[0]; - my $val=$next->[1]; - die "Unrecognized expression: $current" unless defined $op && $op=~/[-(N]/; + my $op=$token->[0]; + my $val=$token->[1]; + die "Unrecognized expression: $previous\n" unless defined $op && $op=~/[-(N]/; token(); return -simple() if $op eq '-'; return $val if $op eq 'N'; my $result=expression(); - $op=$next->[0]; - die "Unbalanced parenthesis: $current" unless defined $op and $op eq ')'; + $op=$token->[0]; + die "Unbalanced parenthesis: $previous\n" unless defined $op and $op eq ')'; token(); return $result; } -- cgit From 1d6f0a2d0806e60cc1351a18c7552fd82ef447c3 Mon Sep 17 00:00:00 2001 From: Luis Mochan Date: Wed, 15 Dec 2021 11:59:20 -0600 Subject: Add test for extra chars at end --- challenge-143/wlmb/perl/ch-1.pl | 1 + 1 file changed, 1 insertion(+) diff --git a/challenge-143/wlmb/perl/ch-1.pl b/challenge-143/wlmb/perl/ch-1.pl index 96c3f72081..e1190540bd 100755 --- a/challenge-143/wlmb/perl/ch-1.pl +++ b/challenge-143/wlmb/perl/ch-1.pl @@ -16,6 +16,7 @@ foreach (@ARGV){ $original_string=$previous=$current=$_; token(); my $result=expression(); + die "Extra characters: $previous\n" if defined $token->[0]; say "$original_string=$result"; } catch { -- cgit From df286d0a88b12c8999eb7f1b54d8f15967c913a4 Mon Sep 17 00:00:00 2001 From: Luis Mochan Date: Wed, 15 Dec 2021 12:08:43 -0600 Subject: Untabify --- challenge-143/wlmb/perl/ch-1.pl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/challenge-143/wlmb/perl/ch-1.pl b/challenge-143/wlmb/perl/ch-1.pl index e1190540bd..4f0ebd8ec4 100755 --- a/challenge-143/wlmb/perl/ch-1.pl +++ b/challenge-143/wlmb/perl/ch-1.pl @@ -13,14 +13,14 @@ my $current; my $token; foreach (@ARGV){ try { - $original_string=$previous=$current=$_; - token(); - my $result=expression(); - die "Extra characters: $previous\n" if defined $token->[0]; - say "$original_string=$result"; + $original_string=$previous=$current=$_; + token(); + my $result=expression(); + die "Extra characters: $previous\n" if defined $token->[0]; + say "$original_string=$result"; } catch { - warn $_; + warn $_; }; } -- cgit From ac3232563d692f76a1493880b4bd4b5f3112be30 Mon Sep 17 00:00:00 2001 From: Luis Mochan Date: Wed, 15 Dec 2021 12:51:48 -0600 Subject: Add unary + --- challenge-143/wlmb/perl/ch-1.pl | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/challenge-143/wlmb/perl/ch-1.pl b/challenge-143/wlmb/perl/ch-1.pl index 4f0ebd8ec4..80c20d3932 100755 --- a/challenge-143/wlmb/perl/ch-1.pl +++ b/challenge-143/wlmb/perl/ch-1.pl @@ -60,12 +60,13 @@ sub term { sub simple { my $op=$token->[0]; my $val=$token->[1]; - die "Unrecognized expression: $previous\n" unless defined $op && $op=~/[-(N]/; + die "Unrecognized expression: $previous\n" unless defined $op && $op=~/[-+(N]/; token(); - return -simple() if $op eq '-'; - return $val if $op eq 'N'; - my $result=expression(); - $op=$token->[0]; + return -simple() if $op eq '-'; # unary - + return simple() if $op eq '+'; # unary + + return $val if $op eq 'N'; # number + my $result=expression(); # parenthesized expression + $op=$token->[0]; # closing parenthesis should follow die "Unbalanced parenthesis: $previous\n" unless defined $op and $op eq ')'; token(); return $result; -- cgit