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 1     1   434 use 5.010001;
  1         3  
4 1     1   3 use strict;
  1         1  
  1         14  
5 1     1   3 use warnings;
  1         1  
  1         20  
6              
7 1     1   414 use MarpaX::Simple qw(gen_parser);
  1         113434  
  1         62  
8              
9 1     1   6 use Exporter qw(import);
  1         1  
  1         188  
10             our @EXPORT_OK = qw(parse_arithmetic);
11              
12             sub parse_arithmetic {
13             state $parser = gen_parser(
14             grammar => <<'_',
15             :default ::= action=>::first
16             lexeme default = latm=>1
17             :start ::= expr
18              
19             expr ::= literal
20             | '(' expr ')' action=>paren assoc=>group
21             || expr '**' expr action=>pow assoc=>right
22             || expr '*' expr action=>mult
23             | expr '/' expr action=>div
24             || expr '+' expr action=>add
25             | expr '-' expr action=>subtract
26              
27             literal ~ digits
28             | sign digits
29             | digits '.' digits
30             | sign digits '.' digits
31             digits ~ [\d]+
32             sign ~ [+-]
33             :discard ~ ws
34             ws ~ [\s]+
35             _
36             actions => {
37             add => sub {
38 2     2   2005 my $h = shift;
39 2         6 $_[0] + $_[2];
40             },
41             subtract => sub {
42 0     0   0 my $h = shift;
43 0         0 $_[0] - $_[2];
44             },
45             mult => sub {
46 2     2   2415 my $h = shift;
47 2         7 $_[0] * $_[2];
48             },
49             div => sub {
50 0     0   0 my $h = shift;
51 0         0 $_[0] / $_[2];
52             },
53             pow => sub {
54 2     2   1849 my $h = shift;
55 2         5 $_[0] ** $_[2];
56             },
57             paren => sub {
58 1     1   28 my $h = shift;
59 1         2 $_[1];
60             },
61             },
62             trace_terminals => $ENV{DEBUG},
63             trace_values => $ENV{DEBUG},
64 3     3 1 832 );
65              
66 3         90526 $parser->($_[0]);
67             }
68              
69             1;
70             # ABSTRACT: Parse arithmetic expression (Marpa version)
71              
72             __END__