File Coverage

blib/lib/PERLANCAR/Parse/Arithmetic/Marpa.pm
Criterion Covered Total %
statement 24 28 85.7
branch n/a
condition n/a
subroutine 10 12 83.3
pod 1 1 100.0
total 35 41 85.3


line stmt bran cond sub pod time code
1             package PERLANCAR::Parse::Arithmetic::Marpa;
2              
3             our $DATE = '2016-06-18'; # DATE
4             our $VERSION = '0.004'; # VERSION
5              
6 1     1   417 use 5.010001;
  1         2  
7 1     1   6 use strict;
  1         2  
  1         24  
8 1     1   4 use warnings;
  1         0  
  1         20  
9              
10 1     1   384 use MarpaX::Simple qw(gen_parser);
  1         103902  
  1         54  
11              
12 1     1   6 use Exporter qw(import);
  1         1  
  1         181  
13             our @EXPORT_OK = qw(parse_arithmetic);
14              
15             sub parse_arithmetic {
16             state $parser = gen_parser(
17             grammar => <<'_',
18             :default ::= action=>::first
19             lexeme default = latm=>1
20             :start ::= expr
21              
22             expr ::= literal
23             | '(' expr ')' action=>paren assoc=>group
24             || expr '**' expr action=>pow assoc=>right
25             || expr '*' expr action=>mult
26             | expr '/' expr action=>div
27             || expr '+' expr action=>add
28             | expr '-' expr action=>subtract
29              
30             literal ~ digits
31             | sign digits
32             | digits '.' digits
33             | sign digits '.' digits
34             digits ~ [\d]+
35             sign ~ [+-]
36             :discard ~ ws
37             ws ~ [\s]+
38             _
39             actions => {
40             add => sub {
41 2     2   2004 my $h = shift;
42 2         6 $_[0] + $_[2];
43             },
44             subtract => sub {
45 0     0   0 my $h = shift;
46 0         0 $_[0] - $_[2];
47             },
48             mult => sub {
49 2     2   2254 my $h = shift;
50 2         6 $_[0] * $_[2];
51             },
52             div => sub {
53 0     0   0 my $h = shift;
54 0         0 $_[0] / $_[2];
55             },
56             pow => sub {
57 2     2   1797 my $h = shift;
58 2         5 $_[0] ** $_[2];
59             },
60             paren => sub {
61 1     1   24 my $h = shift;
62 1         2 $_[1];
63             },
64             },
65             trace_terminals => $ENV{DEBUG},
66             trace_values => $ENV{DEBUG},
67 3     3 1 774 );
68              
69 3         90216 $parser->($_[0]);
70             }
71              
72             1;
73             # ABSTRACT: Parse arithmetic expression (Marpa version)
74              
75             __END__