Parser-LR v20191119 Perl 5 v5.30.0 x86_64-linux-thread-multi

Status
Fail
From
Slaven Rezić (SREZIC)
Dist
Parser-LR v20191119
Platform
Perl 5 v5.30.0 x86_64-linux-thread-multi
Date
2019-11-18 21:00:43
ID
7c03da78-0a46-11ea-bab5-af751f24ea8f
This distribution has been tested as part of the CPAN Testers
project, supporting the Perl programming language.  See
http://wiki.cpantesters.org/ for more information or email
questions to cpan-testers-discuss@perl.org


--
Dear Philip R Brenan,

This is a computer-generated report for Parser-LR-20191119
on perl 5.30.0, created by CPAN-Reporter-1.2018.

Thank you for uploading your work to CPAN.  However, there was a problem
testing your distribution.

If you think this report is invalid, please consult the CPAN Testers Wiki
for suggestions on how to avoid getting FAIL reports for missing library
or binary dependencies, unsupported operating systems, and so on:

http://wiki.cpantesters.org/wiki/CPANAuthorNotes

Sections of this report:

    * Tester comments
    * Program output
    * Prerequisites
    * Environment and other context

------------------------------
TESTER COMMENTS
------------------------------

Additional comments from tester:

none provided

------------------------------
PROGRAM OUTPUT
------------------------------

Output from './Build test':

You tried to plan twice at (eval 73) line 1.
 at /home/cpansand/.cpan/build/2019111821/Data-Table-Text-20191110-0/blib/lib/Data/Table/Text.pm line 3576, <DATA> line 506.
	Data::Table::Text::__ANON__("You tried to plan twice at (eval 73) line 1.\x{a}") called at /usr/share/perl5/vendor_perl/Test2/EventFacet/Trace.pm line 68
	Test2::EventFacet::Trace::throw(Test2::EventFacet::Trace=HASH(0x563ddfe18d90), "You tried to plan twice") called at /usr/share/perl5/vendor_perl/Test2/API/Context.pm line 201
	Test2::API::Context::throw(Test2::API::Context=HASH(0x563ddfe09178), "You tried to plan twice") called at /usr/share/perl5/vendor_perl/Test/Builder.pm line 461
	Test::Builder::plan(Test::Builder=HASH(0x563ddf7f40d8), "tests", 24) called at /usr/share/perl5/vendor_perl/Test/Builder/Module.pm line 92
	Test::Builder::Module::import("tests", 24) called at (eval 73) line 1
	Parser::LR::BEGIN() called at (eval 73) line 1
	eval {...} called at (eval 73) line 1
	eval 'use Test::More tests => 24;

if (1) {
  my $g = compileGrammar(<<END, nosub=>1);
A  A + B
A  B
B  B * C
B  C
C  n
END

  my sub tlmr(@)
   {my $r = longestMatchingRule($g, @_);
    if ($r)
     {delete $r->{print} if $r;
      my %r = $r->%*;
      #say STDERR nws(dump(\\%r));
      }
    $r
   }

  is_deeply tlmr(qw(n)),     {expandable=>"C", expansion=>["n"],           rule=>4};
  is_deeply tlmr(qw(n + n)), {expandable=>"C", expansion=>["n"],           rule=>4};
  is_deeply tlmr(qw(A + B)), {expandable=>"A", expansion=>["A", "+", "B"], rule=>0};
  ok !tlmr(qw(n +));

  my sub trswr($@)
   {my ($rule, @stack) = @_;
    my @tree = (q()) x @stack;
    my $r = reduceStackWithRule($g->rules->[$rule], \\@stack, \\@tree);
    #say STDERR nws(dump(\\@stack));
    \\@stack
   }

  is_deeply trswr(0, qw(A + B)),   [qw(A)];
  is_deeply trswr(0, qw(n A + B)), [qw(n A)];
  is_deeply trswr(4, qw(B * n)),   [qw(B * C)];
  is_deeply trswr(3, qw(B * n)),   [qw(B * B)];                                 # There is no check that the rule actually applies

  my sub tpm(@)
   {my (@stack) = @_;
    my $r = partialMatch($g, @stack);
    $r
   }

  ok 3 == tpm qw(A + B);
  ok 2 == tpm qw(A +);
  ok 1 == tpm qw(A);
  ok 0 == tpm qw(A -);

  my sub tpwg(@)
   {my (@stack) = @_;
    my $r = parseWithGrammarAndLog($g, @stack) =~ s(\\s+\\Z) (\\n)gsr;;
    owf($logFile, $r);
    $r
   }

  ok tpwg(qw(n)) eq <<END;
Terminal: n, stack: (empty)
  Accept first terminal: n to get stack: n
  Reduced in finals by rule 4, expandable: C, stack: C
  Reduced in finals by rule 3, expandable: B, stack: B
  Reduced in finals by rule 1, expandable: A, stack: A
  Parse tree is:
   Rule  Expandable  Terminal
1     1  A
2     3    B
3     4      C
4                    n
END

  ok tpwg(qw(n + n)) eq <<END;
Terminal: n, stack: (empty)
  Accept first terminal: n to get stack: n
Terminal: +, stack: n
  Reduced by rule 4, expandable: C, stack: C
  Reduced by rule 3, expandable: B, stack: B
  Reduced by rule 1, expandable: A, stack: A
  Accept + after 3 reductions to get: A +
Terminal: n, stack: A +
Accepted terminal: n as is, stack: A + n
  Reduced in finals by rule 4, expandable: C, stack: A + C
  Reduced in finals by rule 3, expandable: B, stack: A + B
  Reduced in finals by rule 0, expandable: A, stack: A
  Parse tree is:
   Rule  Expandable  Terminal
1     0  A
2     1    A
3     3      B
4     4        C
5                    n
6                    +
7     3    B
8     4      C
9                    n
END

  ok tpwg(qw(n * n + n)) eq <<END;
Terminal: n, stack: (empty)
  Accept first terminal: n to get stack: n
Terminal: *, stack: n
  Reduced by rule 4, expandable: C, stack: C
  Reduced by rule 3, expandable: B, stack: B
  Accept * after 2 reductions to get: B *
Terminal: n, stack: B *
Accepted terminal: n as is, stack: B * n
Terminal: +, stack: B * n
  Reduced by rule 4, expandable: C, stack: B * C
  Reduced by rule 2, expandable: B, stack: B
  Reduced by rule 1, expandable: A, stack: A
  Accept + after 3 reductions to get: A +
Terminal: n, stack: A +
Accepted terminal: n as is, stack: A + n
  Reduced in finals by rule 4, expandable: C, stack: A + C
  Reduced in finals by rule 3, expandable: B, stack: A + B
  Reduced in finals by rule 0, expandable: A, stack: A
  Parse tree is:
    Rule  Expandable  Terminal
 1     0  A
 2     1    A
 3     2      B
 4     3        B
 5     4          C
 6                    n
 7                    *
 8     4        C
 9                    n
10                    +
11     3    B
12     4      C
13                    n
END

  ok tpwg(qw(n * n + n * n)) eq <<END;
Terminal: n, stack: (empty)
  Accept first terminal: n to get stack: n
Terminal: *, stack: n
  Reduced by rule 4, expandable: C, stack: C
  Reduced by rule 3, expandable: B, stack: B
  Accept * after 2 reductions to get: B *
Terminal: n, stack: B *
Accepted terminal: n as is, stack: B * n
Terminal: +, stack: B * n
  Reduced by rule 4, expandable: C, stack: B * C
  Reduced by rule 2, expandable: B, stack: B
  Reduced by rule 1, expandable: A, stack: A
  Accept + after 3 reductions to get: A +
Terminal: n, stack: A +
Accepted terminal: n as is, stack: A + n
Terminal: *, stack: A + n
  Reduced by rule 4, expandable: C, stack: A + C
  Reduced by rule 3, expandable: B, stack: A + B
  Accept * after 2 reductions to get: A + B *
Terminal: n, stack: A + B *
Accepted terminal: n as is, stack: A + B * n
  Reduced in finals by rule 4, expandable: C, stack: A + B * C
  Reduced in finals by rule 2, expandable: B, stack: A + B
  Reduced in finals by rule 0, expandable: A, stack: A
  Parse tree is:
    Rule  Expandable  Terminal
 1     0  A
 2     1    A
 3     2      B
 4     3        B
 5     4          C
 6                    n
 7                    *
 8     4        C
 9                    n
10                    +
11     2    B
12     3      B
13     4        C
14                    n
15                    *
16     4      C
17                    n
END

  ok tpwg(qw(n + n * n + n)) eq <<END;
Terminal: n, stack: (empty)
  Accept first terminal: n to get stack: n
Terminal: +, stack: n
  Reduced by rule 4, expandable: C, stack: C
  Reduced by rule 3, expandable: B, stack: B
  Reduced by rule 1, expandable: A, stack: A
  Accept + after 3 reductions to get: A +
Terminal: n, stack: A +
Accepted terminal: n as is, stack: A + n
Terminal: *, stack: A + n
  Reduced by rule 4, expandable: C, stack: A + C
  Reduced by rule 3, expandable: B, stack: A + B
  Accept * after 2 reductions to get: A + B *
Terminal: n, stack: A + B *
Accepted terminal: n as is, stack: A + B * n
Terminal: +, stack: A + B * n
  Reduced by rule 4, expandable: C, stack: A + B * C
  Reduced by rule 2, expandable: B, stack: A + B
  Reduced by rule 0, expandable: A, stack: A
  Accept + after 3 reductions to get: A +
Terminal: n, stack: A +
Accepted terminal: n as is, stack: A + n
  Reduced in finals by rule 4, expandable: C, stack: A + C
  Reduced in finals by rule 3, expandable: B, stack: A + B
  Reduced in finals by rule 0, expandable: A, stack: A
  Parse tree is:
    Rule  Expandable  Terminal
 1     0  A
 2     0    A
 3     1      A
 4     3        B
 5     4          C
 6                    n
 7                    +
 8     2      B
 9     3        B
10     4          C
11                    n
12                    *
13     4        C
14                    n
15                    +
16     3    B
17     4      C
18                    n
END
 }

if (1) {
  my $grammar = compileGrammar(<<END, nosub=>1);
A  A + B
A  B
B  B * C
B  C
C  n
END

  my $tree = parseWithGrammar($grammar, qw(n * n + n * n));
  ok printParseTree($grammar, $tree) eq <<END;
    Rule  Expandable  Terminal
 1     0  A
 2     1    A
 3     2      B
 4     3        B
 5     4          C
 6                    n
 7                    *
 8     4        C
 9                    n
10                    +
11     2    B
12     3      B
13     4        C
14                    n
15                    *
16     4      C
17                    n
END
 }

if (1) {
  my $grammar = compileGrammar(<<END, nosub=>1);
A  A plus B
A  B
B  B times C
B  C
C  value
END

  my $tree = parseWithGrammar($grammar, qw(value times value plus value times value));

  ok printParseTreeAsXml($grammar, $tree) eq <<END;
<A rule="0">
  <A rule="1">
    <B rule="2">
      <B rule="3">
        <C rule="4">
          <value pos="0"/>
        </C>
      </B>
      <times pos="1"/>
      <C rule="4">
        <value pos="2"/>
      </C>
    </B>
  </A>
  <plus pos="3"/>
  <B rule="2">
    <B rule="3">
      <C rule="4">
        <value pos="4"/>
      </C>
    </B>
    <times pos="5"/>
    <C rule="4">
      <value pos="6"/>
    </C>
  </B>
</A>
END
 }

if (1) {
  my $grammar = compileGrammar(<<END, nosub=>1);
A  A + B
A  B
B  B * C
B  C
C  n
C  ( A )
C  [ A ]
END

  my $tree = parseWithGrammar $grammar, qw/ n * ( n + ( n * [ n ] ) )/, subsitute=>0;

  ok printParseTree($grammar, $tree) eq <<END;
    Rule  Expandable               Terminal
 1     1  A
 2     2    B
 3     3      B
 4     4        C
 5                                 n
 6                                 *
 7     5      C
 8                                 (
 9     0        A
10     1          A
11     3            B
12     4              C
13                                 n
14                                 +
15     3          B
16     5            C
17                                 (
18     1              A
19     2                B
20     3                  B
21     4                    C
22                                 n
23                                 *
24     6                  C
25                                 [
26     1                    A
27     3                      B
28     4                        C
29                                 n
30                                 ]
31                                 )
32                                 )
END
 }

if (1) {                                                                        #TcompileGrammar  #TprintGrammar  #TparseWithGrammar #TprintParseTree #TprintParseTreeAsXml
  my $grammar = compileGrammar(<<END);
A  A + B
A  B
B  B * C
B  C
C  n
C  ( A )
C  [ A ]
C  { A }
C  ( )
C  [ ]
C  { }
END

  ok printGrammar($grammar) eq <<END;
    Rule  Symbol  Expansion
 1     0  A       A          +  B
 2     1  A       B
 3     2  B       B          *  n
 4     3  B       B          *  (  A  )
 5     4  B       B          *  [  A  ]
 6     5  B       B          *  {  A  }
 7     6  B       B          *  (  )
 8     7  B       B          *  [  ]
 9     8  B       B          *  {  }
10     9  B       n
11    10  B       (          A  )
12    11  B       [          A  ]
13    12  B       {          A  }
14    13  B       (          )
15    14  B       [          ]
16    15  B       {          }
END

  my $tree = parseWithGrammar($grammar, qw/( [ { }  ]  +  [ { n }  ] ) * [ n + n ]  /);

  ok printParseTree($grammar, $tree) eq <<END;
    Rule  Expandable         Terminal
 1     1  A
 2     4    B
 3    10      B
 4                           (
 5     0        A
 6     1          A
 7    11            B
 8                           [
 9     1              A
10    15                B
11                           {
12                           }
13                           ]
14                           +
15    11          B
16                           [
17     1            A
18    12              B
19                           {
20     1                A
21     9                  B
22                           n
23                           }
24                           ]
25                           )
26                           *
27                           [
28     0      A
29     1        A
30     9          B
31                           n
32                           +
33     9        B
34                           n
35                           ]
END

  ok printParseTreeAsXml($grammar, $tree) eq <<END;
<A rule="1">
  <B rule="4">
    <B rule="10">
      <"(" pos="0"/>
      <A rule="0">
        <A rule="1">
          <B rule="11">
            <"[" pos="1"/>
            <A rule="1">
              <B rule="15">
                <"{" pos="2"/>
                <"}" pos="3"/>
              </B>
            </A>
            <"]" pos="4"/>
          </B>
        </A>
        <"+" pos="5"/>
        <B rule="11">
          <"[" pos="6"/>
          <A rule="1">
            <B rule="12">
              <"{" pos="7"/>
              <A rule="1">
                <B rule="9">
                  <n pos="8"/>
                </B>
              </A>
              <"}" pos="9"/>
            </B>
          </A>
          <"]" pos="10"/>
        </B>
      </A>
      <")" pos="11"/>
    </B>
    <"*" pos="12"/>
    <"[" pos="13"/>
    <A rule="0">
      <A rule="1">
        <B rule="9">
          <n pos="14"/>
        </B>
      </A>
      <"+" pos="15"/>
      <B rule="9">
        <n pos="16"/>
      </B>
    </A>
    <"]" pos="17"/>
  </B>
</A>
END

  ok printGrammarAsXml($grammar) eq <<END
<grammar>
  <A><A/><"+"/><B/></A>
  <A><B/></A>
  <B><B/><"*"/><n/></B>
  <B><B/><"*"/><"("/><A/><")"/></B>
  <B><B/><"*"/><"["/><A/><"]"/></B>
  <B><B/><"*"/><"{"/><A/><"}"/></B>
  <B><B/><"*"/><"("/><")"/></B>
  <B><B/><"*"/><"["/><"]"/></B>
  <B><B/><"*"/><"{"/><"}"/></B>
  <B><n/></B>
  <B><"("/><A/><")"/></B>
  <B><"["/><A/><"]"/></B>
  <B><"{"/><A/><"}"/></B>
  <B><"("/><")"/></B>
  <B><"["/><"]"/></B>
  <B><"{"/><"}"/></B>
</grammar>
END
 }

done_testing;
' called at lib/Parser/LR.pm line 1831
	Parser::LR::test("Parser::LR") called at test.pl line 11
BEGIN failed--compilation aborted at (eval 73) line 1, <DATA> line 506.
 at /home/cpansand/.cpan/build/2019111821/Data-Table-Text-20191110-0/blib/lib/Data/Table/Text.pm line 3576, <DATA> line 506.
	Data::Table::Text::__ANON__("You tried to plan twice at (eval 73) line 1.\x{a} at /home/cpansa"...) called at (eval 73) line 1
	eval 'use Test::More tests => 24;

if (1) {
  my $g = compileGrammar(<<END, nosub=>1);
A  A + B
A  B
B  B * C
B  C
C  n
END

  my sub tlmr(@)
   {my $r = longestMatchingRule($g, @_);
    if ($r)
     {delete $r->{print} if $r;
      my %r = $r->%*;
      #say STDERR nws(dump(\\%r));
      }
    $r
   }

  is_deeply tlmr(qw(n)),     {expandable=>"C", expansion=>["n"],           rule=>4};
  is_deeply tlmr(qw(n + n)), {expandable=>"C", expansion=>["n"],           rule=>4};
  is_deeply tlmr(qw(A + B)), {expandable=>"A", expansion=>["A", "+", "B"], rule=>0};
  ok !tlmr(qw(n +));

  my sub trswr($@)
   {my ($rule, @stack) = @_;
    my @tree = (q()) x @stack;
    my $r = reduceStackWithRule($g->rules->[$rule], \\@stack, \\@tree);
    #say STDERR nws(dump(\\@stack));
    \\@stack
   }

  is_deeply trswr(0, qw(A + B)),   [qw(A)];
  is_deeply trswr(0, qw(n A + B)), [qw(n A)];
  is_deeply trswr(4, qw(B * n)),   [qw(B * C)];
  is_deeply trswr(3, qw(B * n)),   [qw(B * B)];                                 # There is no check that the rule actually applies

  my sub tpm(@)
   {my (@stack) = @_;
    my $r = partialMatch($g, @stack);
    $r
   }

  ok 3 == tpm qw(A + B);
  ok 2 == tpm qw(A +);
  ok 1 == tpm qw(A);
  ok 0 == tpm qw(A -);

  my sub tpwg(@)
   {my (@stack) = @_;
    my $r = parseWithGrammarAndLog($g, @stack) =~ s(\\s+\\Z) (\\n)gsr;;
    owf($logFile, $r);
    $r
   }

  ok tpwg(qw(n)) eq <<END;
Terminal: n, stack: (empty)
  Accept first terminal: n to get stack: n
  Reduced in finals by rule 4, expandable: C, stack: C
  Reduced in finals by rule 3, expandable: B, stack: B
  Reduced in finals by rule 1, expandable: A, stack: A
  Parse tree is:
   Rule  Expandable  Terminal
1     1  A
2     3    B
3     4      C
4                    n
END

  ok tpwg(qw(n + n)) eq <<END;
Terminal: n, stack: (empty)
  Accept first terminal: n to get stack: n
Terminal: +, stack: n
  Reduced by rule 4, expandable: C, stack: C
  Reduced by rule 3, expandable: B, stack: B
  Reduced by rule 1, expandable: A, stack: A
  Accept + after 3 reductions to get: A +
Terminal: n, stack: A +
Accepted terminal: n as is, stack: A + n
  Reduced in finals by rule 4, expandable: C, stack: A + C
  Reduced in finals by rule 3, expandable: B, stack: A + B
  Reduced in finals by rule 0, expandable: A, stack: A
  Parse tree is:
   Rule  Expandable  Terminal
1     0  A
2     1    A
3     3      B
4     4        C
5                    n
6                    +
7     3    B
8     4      C
9                    n
END

  ok tpwg(qw(n * n + n)) eq <<END;
Terminal: n, stack: (empty)
  Accept first terminal: n to get stack: n
Terminal: *, stack: n
  Reduced by rule 4, expandable: C, stack: C
  Reduced by rule 3, expandable: B, stack: B
  Accept * after 2 reductions to get: B *
Terminal: n, stack: B *
Accepted terminal: n as is, stack: B * n
Terminal: +, stack: B * n
  Reduced by rule 4, expandable: C, stack: B * C
  Reduced by rule 2, expandable: B, stack: B
  Reduced by rule 1, expandable: A, stack: A
  Accept + after 3 reductions to get: A +
Terminal: n, stack: A +
Accepted terminal: n as is, stack: A + n
  Reduced in finals by rule 4, expandable: C, stack: A + C
  Reduced in finals by rule 3, expandable: B, stack: A + B
  Reduced in finals by rule 0, expandable: A, stack: A
  Parse tree is:
    Rule  Expandable  Terminal
 1     0  A
 2     1    A
 3     2      B
 4     3        B
 5     4          C
 6                    n
 7                    *
 8     4        C
 9                    n
10                    +
11     3    B
12     4      C
13                    n
END

  ok tpwg(qw(n * n + n * n)) eq <<END;
Terminal: n, stack: (empty)
  Accept first terminal: n to get stack: n
Terminal: *, stack: n
  Reduced by rule 4, expandable: C, stack: C
  Reduced by rule 3, expandable: B, stack: B
  Accept * after 2 reductions to get: B *
Terminal: n, stack: B *
Accepted terminal: n as is, stack: B * n
Terminal: +, stack: B * n
  Reduced by rule 4, expandable: C, stack: B * C
  Reduced by rule 2, expandable: B, stack: B
  Reduced by rule 1, expandable: A, stack: A
  Accept + after 3 reductions to get: A +
Terminal: n, stack: A +
Accepted terminal: n as is, stack: A + n
Terminal: *, stack: A + n
  Reduced by rule 4, expandable: C, stack: A + C
  Reduced by rule 3, expandable: B, stack: A + B
  Accept * after 2 reductions to get: A + B *
Terminal: n, stack: A + B *
Accepted terminal: n as is, stack: A + B * n
  Reduced in finals by rule 4, expandable: C, stack: A + B * C
  Reduced in finals by rule 2, expandable: B, stack: A + B
  Reduced in finals by rule 0, expandable: A, stack: A
  Parse tree is:
    Rule  Expandable  Terminal
 1     0  A
 2     1    A
 3     2      B
 4     3        B
 5     4          C
 6                    n
 7                    *
 8     4        C
 9                    n
10                    +
11     2    B
12     3      B
13     4        C
14                    n
15                    *
16     4      C
17                    n
END

  ok tpwg(qw(n + n * n + n)) eq <<END;
Terminal: n, stack: (empty)
  Accept first terminal: n to get stack: n
Terminal: +, stack: n
  Reduced by rule 4, expandable: C, stack: C
  Reduced by rule 3, expandable: B, stack: B
  Reduced by rule 1, expandable: A, stack: A
  Accept + after 3 reductions to get: A +
Terminal: n, stack: A +
Accepted terminal: n as is, stack: A + n
Terminal: *, stack: A + n
  Reduced by rule 4, expandable: C, stack: A + C
  Reduced by rule 3, expandable: B, stack: A + B
  Accept * after 2 reductions to get: A + B *
Terminal: n, stack: A + B *
Accepted terminal: n as is, stack: A + B * n
Terminal: +, stack: A + B * n
  Reduced by rule 4, expandable: C, stack: A + B * C
  Reduced by rule 2, expandable: B, stack: A + B
  Reduced by rule 0, expandable: A, stack: A
  Accept + after 3 reductions to get: A +
Terminal: n, stack: A +
Accepted terminal: n as is, stack: A + n
  Reduced in finals by rule 4, expandable: C, stack: A + C
  Reduced in finals by rule 3, expandable: B, stack: A + B
  Reduced in finals by rule 0, expandable: A, stack: A
  Parse tree is:
    Rule  Expandable  Terminal
 1     0  A
 2     0    A
 3     1      A
 4     3        B
 5     4          C
 6                    n
 7                    +
 8     2      B
 9     3        B
10     4          C
11                    n
12                    *
13     4        C
14                    n
15                    +
16     3    B
17     4      C
18                    n
END
 }

if (1) {
  my $grammar = compileGrammar(<<END, nosub=>1);
A  A + B
A  B
B  B * C
B  C
C  n
END

  my $tree = parseWithGrammar($grammar, qw(n * n + n * n));
  ok printParseTree($grammar, $tree) eq <<END;
    Rule  Expandable  Terminal
 1     0  A
 2     1    A
 3     2      B
 4     3        B
 5     4          C
 6                    n
 7                    *
 8     4        C
 9                    n
10                    +
11     2    B
12     3      B
13     4        C
14                    n
15                    *
16     4      C
17                    n
END
 }

if (1) {
  my $grammar = compileGrammar(<<END, nosub=>1);
A  A plus B
A  B
B  B times C
B  C
C  value
END

  my $tree = parseWithGrammar($grammar, qw(value times value plus value times value));

  ok printParseTreeAsXml($grammar, $tree) eq <<END;
<A rule="0">
  <A rule="1">
    <B rule="2">
      <B rule="3">
        <C rule="4">
          <value pos="0"/>
        </C>
      </B>
      <times pos="1"/>
      <C rule="4">
        <value pos="2"/>
      </C>
    </B>
  </A>
  <plus pos="3"/>
  <B rule="2">
    <B rule="3">
      <C rule="4">
        <value pos="4"/>
      </C>
    </B>
    <times pos="5"/>
    <C rule="4">
      <value pos="6"/>
    </C>
  </B>
</A>
END
 }

if (1) {
  my $grammar = compileGrammar(<<END, nosub=>1);
A  A + B
A  B
B  B * C
B  C
C  n
C  ( A )
C  [ A ]
END

  my $tree = parseWithGrammar $grammar, qw/ n * ( n + ( n * [ n ] ) )/, subsitute=>0;

  ok printParseTree($grammar, $tree) eq <<END;
    Rule  Expandable               Terminal
 1     1  A
 2     2    B
 3     3      B
 4     4        C
 5                                 n
 6                                 *
 7     5      C
 8                                 (
 9     0        A
10     1          A
11     3            B
12     4              C
13                                 n
14                                 +
15     3          B
16     5            C
17                                 (
18     1              A
19     2                B
20     3                  B
21     4                    C
22                                 n
23                                 *
24     6                  C
25                                 [
26     1                    A
27     3                      B
28     4                        C
29                                 n
30                                 ]
31                                 )
32                                 )
END
 }

if (1) {                                                                        #TcompileGrammar  #TprintGrammar  #TparseWithGrammar #TprintParseTree #TprintParseTreeAsXml
  my $grammar = compileGrammar(<<END);
A  A + B
A  B
B  B * C
B  C
C  n
C  ( A )
C  [ A ]
C  { A }
C  ( )
C  [ ]
C  { }
END

  ok printGrammar($grammar) eq <<END;
    Rule  Symbol  Expansion
 1     0  A       A          +  B
 2     1  A       B
 3     2  B       B          *  n
 4     3  B       B          *  (  A  )
 5     4  B       B          *  [  A  ]
 6     5  B       B          *  {  A  }
 7     6  B       B          *  (  )
 8     7  B       B          *  [  ]
 9     8  B       B          *  {  }
10     9  B       n
11    10  B       (          A  )
12    11  B       [          A  ]
13    12  B       {          A  }
14    13  B       (          )
15    14  B       [          ]
16    15  B       {          }
END

  my $tree = parseWithGrammar($grammar, qw/( [ { }  ]  +  [ { n }  ] ) * [ n + n ]  /);

  ok printParseTree($grammar, $tree) eq <<END;
    Rule  Expandable         Terminal
 1     1  A
 2     4    B
 3    10      B
 4                           (
 5     0        A
 6     1          A
 7    11            B
 8                           [
 9     1              A
10    15                B
11                           {
12                           }
13                           ]
14                           +
15    11          B
16                           [
17     1            A
18    12              B
19                           {
20     1                A
21     9                  B
22                           n
23                           }
24                           ]
25                           )
26                           *
27                           [
28     0      A
29     1        A
30     9          B
31                           n
32                           +
33     9        B
34                           n
35                           ]
END

  ok printParseTreeAsXml($grammar, $tree) eq <<END;
<A rule="1">
  <B rule="4">
    <B rule="10">
      <"(" pos="0"/>
      <A rule="0">
        <A rule="1">
          <B rule="11">
            <"[" pos="1"/>
            <A rule="1">
              <B rule="15">
                <"{" pos="2"/>
                <"}" pos="3"/>
              </B>
            </A>
            <"]" pos="4"/>
          </B>
        </A>
        <"+" pos="5"/>
        <B rule="11">
          <"[" pos="6"/>
          <A rule="1">
            <B rule="12">
              <"{" pos="7"/>
              <A rule="1">
                <B rule="9">
                  <n pos="8"/>
                </B>
              </A>
              <"}" pos="9"/>
            </B>
          </A>
          <"]" pos="10"/>
        </B>
      </A>
      <")" pos="11"/>
    </B>
    <"*" pos="12"/>
    <"[" pos="13"/>
    <A rule="0">
      <A rule="1">
        <B rule="9">
          <n pos="14"/>
        </B>
      </A>
      <"+" pos="15"/>
      <B rule="9">
        <n pos="16"/>
      </B>
    </A>
    <"]" pos="17"/>
  </B>
</A>
END

  ok printGrammarAsXml($grammar) eq <<END
<grammar>
  <A><A/><"+"/><B/></A>
  <A><B/></A>
  <B><B/><"*"/><n/></B>
  <B><B/><"*"/><"("/><A/><")"/></B>
  <B><B/><"*"/><"["/><A/><"]"/></B>
  <B><B/><"*"/><"{"/><A/><"}"/></B>
  <B><B/><"*"/><"("/><")"/></B>
  <B><B/><"*"/><"["/><"]"/></B>
  <B><B/><"*"/><"{"/><"}"/></B>
  <B><n/></B>
  <B><"("/><A/><")"/></B>
  <B><"["/><A/><"]"/></B>
  <B><"{"/><A/><"}"/></B>
  <B><"("/><")"/></B>
  <B><"["/><"]"/></B>
  <B><"{"/><"}"/></B>
</grammar>
END
 }

done_testing;
' called at lib/Parser/LR.pm line 1831
	Parser::LR::test("Parser::LR") called at test.pl line 11
 at /home/cpansand/.cpan/build/2019111821/Data-Table-Text-20191110-0/blib/lib/Data/Table/Text.pm line 3576, <DATA> line 506.
	Data::Table::Text::__ANON__("You tried to plan twice at (eval 73) line 1.\x{a} at /home/cpansa"...) called at lib/Parser/LR.pm line 1832
	Parser::LR::test("Parser::LR") called at test.pl line 11
# Looks like your test exited with 255 just after 30.
test.pl .. 
Dubious, test returned 255 (wstat 65280, 0xff00)
All 30 subtests passed 

Test Summary Report
-------------------
test.pl (Wstat: 65280 Tests: 30 Failed: 0)
  Non-zero exit status: 255
Files=1, Tests=30,  0 wallclock secs ( 0.05 usr  0.00 sys +  0.23 cusr  0.07 csys =  0.35 CPU)
Result: FAIL
Failed 1/1 test programs. 0/30 subtests failed.

------------------------------
PREREQUISITES
------------------------------

Prerequisite modules loaded:

requires:

    Module                   Need     Have    
    ------------------------ -------- --------
    Carp                     0        1.50    
    Data::DFA                20180429 20191111
    Data::Dump               0        1.23    
    Data::NFA                20191110 20191110
    Data::Table::Text        20191110 20191110
    Exporter                 0        5.73    
    Math::Cartesian::Product 1.009    1.009   
    Test2::API               0        1.302168
    Test::More               0        1.302168

configure_requires:

    Module                   Need     Have    
    ------------------------ -------- --------
    Module::Build            0.4224   0.4229  


------------------------------
ENVIRONMENT AND OTHER CONTEXT
------------------------------

Environment variables:

    LANG = en_US.UTF-8
    PATH = /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/cpansand/bin/linux-gnu:/home/cpansand/bin/sh:/home/cpansand/bin:/usr/games:/home/cpansand/devel:/home/eserte/src/srezic-misc/scripts
    PERL5LIB = /home/cpansand/.cpan/build/2019111821/Math-Cartesian-Product-1.009-0/blib/arch:/home/cpansand/.cpan/build/2019111821/Math-Cartesian-Product-1.009-0/blib/lib:/home/cpansand/.cpan/build/2019111821/Data-DFA-20191111-0/blib/arch:/home/cpansand/.cpan/build/2019111821/Data-DFA-20191111-0/blib/lib:/home/cpansand/.cpan/build/2019111821/Data-NFA-20191110-0/blib/arch:/home/cpansand/.cpan/build/2019111821/Data-NFA-20191110-0/blib/lib:/home/cpansand/.cpan/build/2019111821/Data-Table-Text-20191110-0/blib/arch:/home/cpansand/.cpan/build/2019111821/Data-Table-Text-20191110-0/blib/lib:/home/cpansand/.cpan/build/2019111821/JSON-4.02-2/blib/arch:/home/cpansand/.cpan/build/2019111821/JSON-4.02-2/blib/lib
    PERL5OPT = 
    PERL5_CPANPLUS_IS_RUNNING = 4084338
    PERL5_CPAN_IS_RUNNING = 4084338
    PERL5_CPAN_IS_RUNNING_IN_RECURSION = 4084114,4084338
    PERLDOC = -MPod::Perldoc::ToTextOverstrike
    PERL_BATCH = yes
    PERL_CANARY_STABILITY_NOPROMPT = 1
    PERL_CPAN_REPORTER_CONFIG = /var/tmp/cpansmoker-1023/2019111821/cpanreporter_000_config.ini
    PERL_EXTUTILS_AUTOINSTALL = --defaultdeps
    PERL_USE_UNSAFE_INC = 1
    SHELL = /usr/bin/zsh
    TERM = screen
    TMPDIR = /var/tmp/cpansmoker-1023/2019111821

Perl special variables (and OS-specific diagnostics, for MSWin32):

    $^X = /usr/bin/perl
    $UID/$EUID = 1023 / 1023
    $GID = 1023 1023
    $EGID = 1023 1023

Perl module toolchain versions installed:

    Module              Have    
    ------------------- --------
    CPAN                2.27    
    CPAN::Meta          2.150010
    Cwd                 3.78    
    ExtUtils::CBuilder  0.280231
    ExtUtils::Command   7.38    
    ExtUtils::Install   2.14    
    ExtUtils::MakeMaker 7.38    
    ExtUtils::Manifest  1.72    
    ExtUtils::ParseXS   3.40    
    File::Spec          3.78    
    JSON                4.02    
    JSON::PP            4.04    
    Module::Build       0.4229  
    Module::Signature   n/a     
    Parse::CPAN::Meta   2.150010
    Test::Harness       3.42    
    Test::More          1.302168
    YAML                n/a     
    YAML::Syck          1.31    
    version             0.9924  


--

Summary of my perl5 (revision 5 version 30 subversion 0) configuration:
   
  Platform:
    osname=linux
    osvers=5.0.6-200.fc29.x86_64
    archname=x86_64-linux-thread-multi
    uname='linux buildvm-31.phx2.fedoraproject.org 5.0.6-200.fc29.x86_64 #1 smp wed apr 3 15:09:51 utc 2019 x86_64 x86_64 x86_64 gnulinux '
    config_args='-des -Doptimize=none -Dccflags=-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Dldflags=-Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Dccdlflags=-Wl,--enable-new-dtags -Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Dlddlflags=-shared -Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Dshrpdir=/usr/lib64 -DDEBUGGING=-g -Dversion=5.30.0 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dprefix=/usr -Dvendorprefix=/usr -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl5/5.30 -Dsitearch=/usr/local/lib64/perl5/5.30 -Dprivlib=/usr/share/perl5 -Dvendorlib=/usr/share/perl5/vendor_perl -Darchlib=/usr/lib64/perl5 -Dvendorarch=/usr/lib64/perl5/vendor_perl -Darchname=x86_64-linux-thread-multi -Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Duseshrplib -Dusethreads -Duseithreads -Dusedtrace=/usr/bin/dtrace -Duselargefiles -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto -Ud_endservent_r_proto -Ud_setservent_r_proto -Dscriptdir=/usr/bin -Dusesitecustomize -Duse64bitint'
    hint=recommended
    useposix=true
    d_sigaction=define
    useithreads=define
    usemultiplicity=define
    use64bitint=define
    use64bitall=define
    uselongdouble=undef
    usemymalloc=n
    default_inc_excludes_dot=define
    bincompat5005=undef
  Compiler:
    cc='gcc'
    ccflags ='-D_REENTRANT -D_GNU_SOURCE -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fwrapv -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
    optimize='  -g'
    cppflags='-D_REENTRANT -D_GNU_SOURCE -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fwrapv -fno-strict-aliasing -I/usr/local/include'
    ccversion=''
    gccversion='9.1.1 20190605 (Red Hat 9.1.1-2)'
    gccosandvers=''
    intsize=4
    longsize=8
    ptrsize=8
    doublesize=8
    byteorder=12345678
    doublekind=3
    d_longlong=define
    longlongsize=8
    d_longdbl=define
    longdblsize=16
    longdblkind=3
    ivtype='long'
    ivsize=8
    nvtype='double'
    nvsize=8
    Off_t='off_t'
    lseeksize=8
    alignbytes=8
    prototype=define
  Linker and Libraries:
    ld='gcc'
    ldflags ='-Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -fstack-protector-strong -L/usr/local/lib'
    libpth=/usr/local/lib64 /lib64 /usr/lib64 /usr/local/lib /usr/lib /lib/../lib64 /usr/lib/../lib64 /lib
    libs=-lpthread -lresolv -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat
    perllibs=-lpthread -lresolv -ldl -lm -lcrypt -lutil -lc
    libc=libc-2.30.so
    so=so
    useshrplib=true
    libperl=libperl.so
    gnulibc_version='2.30'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs
    dlext=so
    d_dlsymun=undef
    ccdlflags='-Wl,--enable-new-dtags -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld'
    cccdlflags='-fPIC'
    lddlflags='-lpthread -shared -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -L/usr/local/lib -fstack-protector-strong'


Characteristics of this binary (from libperl): 
  Compile-time options:
    HAS_TIMES
    MULTIPLICITY
    PERLIO_LAYERS
    PERL_COPY_ON_WRITE
    PERL_DONT_CREATE_GVSV
    PERL_IMPLICIT_CONTEXT
    PERL_MALLOC_WRAP
    PERL_OP_PARENT
    PERL_PRESERVE_IVUV
    USE_64_BIT_ALL
    USE_64_BIT_INT
    USE_ITHREADS
    USE_LARGE_FILES
    USE_LOCALE
    USE_LOCALE_COLLATE
    USE_LOCALE_CTYPE
    USE_LOCALE_NUMERIC
    USE_LOCALE_TIME
    USE_PERLIO
    USE_PERL_ATOF
    USE_REENTRANT_API
    USE_SITECUSTOMIZE
    USE_THREAD_SAFE_LOCALE
  Locally applied patches:
    Fedora Patch1: Removes date check, Fedora/RHEL specific
    Fedora Patch2: support for libdir64
    Fedora Patch3: use libresolv instead of libbind
    Fedora Patch4: USE_MM_LD_RUN_PATH
    Fedora Patch5: Provide MM::maybe_command independently (bug #1129443)
    Fedora Patch6: Dont run one io test due to random builder failures
    Fedora Patch8: Define SONAME for libperl.so
    Fedora Patch9: Install libperl.so to -Dshrpdir value
    Fedora Patch10: Make *DBM_File desctructors thread-safe (RT#61912)
    Fedora Patch11: Replace EU::MakeMaker dependency with EU::MM::Utils in IPC::Cmd (bug #1129443)
    Fedora Patch12: Link XS modules to pthread library to fix linking with -z defs
    Fedora Patch13: Pass the correct CFLAGS to dtrace
    Fedora Patch14: Fix an out-of-buffer read while parsing a Unicode property name (RT#134134)
    Fedora Patch15: Do not panic when outputting a warning (RT#134059)
    Fedora Patch16: Fix memory handling when parsing string literals
    Fedora Patch17: Fix an undefined behavior in shifting IV variables
    Fedora Patch18: Fix an undefined behavior in shifting IV variables
    Fedora Patch19: Fix an undefined behavior in shifting IV variables
    Fedora Patch20: Fix stacking file test operators (CPAN RT#127073)
    Fedora Patch21: Fix a crash in SIGALARM handler when waiting on a child process to be closed (RT#122112)
    Fedora Patch22: Fix a crash in SIGALARM handler when waiting on a child process to be closed (RT#122112)
    Fedora Patch23: Fix a crash in SIGALARM handler when waiting on a child process to be closed (RT#122112)
    Fedora Patch24: Fix a crash with a negative precision in sprintf function (RT#134008)
    Fedora Patch25: Fix a crash with a negative precision in sprintf function (RT#134008)
    Fedora Patch26: Fix an erroneous assertion on OP_SCALAR (RT#134048)
    Fedora Patch27: Prevent from wrapping a width in a numeric format string (RT#133913)
    Fedora Patch28: Fix subroutine protypes to track reference aliases (RT#134072)
    Fedora Patch29: Improve retrieving a scalar value of a variable modified in a signal handler (RT#134035)
    Fedora Patch30: Fix changing packet destination sent from a UDP IO::Socket object (RT#133936)
    Fedora Patch31: Fix changing packet destination sent from a UDP IO::Socket object (RT#133936)
    Fedora Patch32: Fix changing packet destination sent from a UDP IO::Socket object (RT#133936)
    Fedora Patch33: Fix a stack underflow in readline() if passed an empty array as an argument (#RT133989)
    Fedora Patch34: Fix setting supplementar group IDs (RT#134169)
    Fedora Patch35: Fix setting supplementar group IDs (RT#134169)
    Fedora Patch36: Fix setting supplementar group IDs (RT#134169)
    Fedora Patch37: Fix %{^CAPTURE_ALL} to be an alias for %- variable (RT#131867)
    Fedora Patch38: Fix %{^CAPTURE} value when used after @{^CAPTURE} (RT#134193)
    Fedora Patch39: Fix %{^CAPTURE} value when used after @{^CAPTURE} (RT#134193)
    Fedora Patch40: Fix a test for a crash in SIGALARM handler when waiting on a child process to be closed (RT#122112)
    Fedora Patch41: Fix a crash on an uninitialized warning when processing a multideref node (RT#134275)
    Fedora Patch42: Preserve append mode when opening anonymous files (RT#134221)
    Fedora Patch43: Preserve append mode when opening anonymous files (RT#134221)
    Fedora Patch44: Preserve append mode when opening anonymous files (RT#134221)
    Fedora Patch45: Fix propagating non-string variables in an exception value (RT#134291)
    Fedora Patch46: Include trailing zero in scalars holding trie data (RT#134207)
    Fedora Patch47: Fix a use after free in /(?{...})/ (RT#134208)
    Fedora Patch48: Fix a use after free in debugging output of a collation
    Fedora Patch49: Fix a NULL pointer dereference in PerlIOVia_pushed()
    Fedora Patch50: Fix a crash when setting $@ on unwinding a call stack (RT#134266)
    Fedora Patch51: Fix parsing a denominator when parsing a Unicode property name
    Fedora Patch52: Fix a documentation about a future API change
    Fedora Patch53: Do not run File-Find tests in parallel
    Fedora Patch54: Fix parsing a Unicode property name when compiling a regular expression
    Fedora Patch55: Fix a buffer overread when parsing a Unicode property while compiling a regular expression (RT#134133)
    Fedora Patch56: Do not interpret 0x and 0b prefixes when numifying strings (RT#134230)
    Fedora Patch57: Fix a buffer overread when compiling a regular expression with many escapes (RT#134325)
    Fedora Patch58: Fix a buffer overflow when compiling a regular expression with many branches (RT#134329)
    Fedora Patch59: Correct a misspelling in perlrebackslash documentation (RT#134395)
    Fedora Patch60: Fix a memory leak when matching a UTF-8 regular expression (RT#134329)
    Fedora Patch61: Fix a detection for futimes (RT#134432)
    Fedora Patch62: Fix a detection for futimes (RT#134432)
    Fedora Patch200: Link XS modules to libperl.so with EU::CBuilder on Linux
    Fedora Patch201: Link XS modules to libperl.so with EU::MM on Linux
  Built under linux
  Compiled at Sep 11 2019 00:00:00
  %ENV:
    PERL5LIB="/home/cpansand/.cpan/build/2019111821/Math-Cartesian-Product-1.009-0/blib/arch:/home/cpansand/.cpan/build/2019111821/Math-Cartesian-Product-1.009-0/blib/lib:/home/cpansand/.cpan/build/2019111821/Data-DFA-20191111-0/blib/arch:/home/cpansand/.cpan/build/2019111821/Data-DFA-20191111-0/blib/lib:/home/cpansand/.cpan/build/2019111821/Data-NFA-20191110-0/blib/arch:/home/cpansand/.cpan/build/2019111821/Data-NFA-20191110-0/blib/lib:/home/cpansand/.cpan/build/2019111821/Data-Table-Text-20191110-0/blib/arch:/home/cpansand/.cpan/build/2019111821/Data-Table-Text-20191110-0/blib/lib:/home/cpansand/.cpan/build/2019111821/JSON-4.02-2/blib/arch:/home/cpansand/.cpan/build/2019111821/JSON-4.02-2/blib/lib"
    PERL5OPT=""
    PERL5_CPANPLUS_IS_RUNNING="4084338"
    PERL5_CPAN_IS_RUNNING="4084338"
    PERL5_CPAN_IS_RUNNING_IN_RECURSION="4084114,4084338"
    PERLDOC="-MPod::Perldoc::ToTextOverstrike"
    PERL_BATCH="yes"
    PERL_CANARY_STABILITY_NOPROMPT="1"
    PERL_CPAN_REPORTER_CONFIG="/var/tmp/cpansmoker-1023/2019111821/cpanreporter_000_config.ini"
    PERL_EXTUTILS_AUTOINSTALL="--defaultdeps"
    PERL_USE_UNSAFE_INC="1"
  @INC:
    /home/cpansand/.cpan/build/2019111821/Math-Cartesian-Product-1.009-0/blib/arch
    /home/cpansand/.cpan/build/2019111821/Math-Cartesian-Product-1.009-0/blib/lib
    /home/cpansand/.cpan/build/2019111821/Data-DFA-20191111-0/blib/arch
    /home/cpansand/.cpan/build/2019111821/Data-DFA-20191111-0/blib/lib
    /home/cpansand/.cpan/build/2019111821/Data-NFA-20191110-0/blib/arch
    /home/cpansand/.cpan/build/2019111821/Data-NFA-20191110-0/blib/lib
    /home/cpansand/.cpan/build/2019111821/Data-Table-Text-20191110-0/blib/arch
    /home/cpansand/.cpan/build/2019111821/Data-Table-Text-20191110-0/blib/lib
    /home/cpansand/.cpan/build/2019111821/JSON-4.02-2/blib/arch
    /home/cpansand/.cpan/build/2019111821/JSON-4.02-2/blib/lib
    /usr/local/lib64/perl5/5.30
    /usr/local/share/perl5/5.30
    /usr/lib64/perl5/vendor_perl
    /usr/share/perl5/vendor_perl
    /usr/lib64/perl5
    /usr/share/perl5
    .