|
1 | 1 | use QASTNode;
|
2 | 2 |
|
3 | 3 | class QRegex::NFA {
|
4 |
| - our $EDGE_FATE := 0; |
5 |
| - our $EDGE_EPSILON := 1; |
6 |
| - our $EDGE_CODEPOINT := 2; |
7 |
| - our $EDGE_CODEPOINT_NEG := 3; |
8 |
| - our $EDGE_CHARCLASS := 4; |
9 |
| - our $EDGE_CHARCLASS_NEG := 5; |
10 |
| - our $EDGE_CHARLIST := 6; |
11 |
| - our $EDGE_CHARLIST_NEG := 7; |
12 |
| - our $EDGE_SUBRULE := 8; |
| 4 | + our $EDGE_FATE := 0; |
| 5 | + our $EDGE_EPSILON := 1; |
| 6 | + our $EDGE_CODEPOINT := 2; |
| 7 | + our $EDGE_CODEPOINT_NEG := 3; |
| 8 | + our $EDGE_CHARCLASS := 4; |
| 9 | + our $EDGE_CHARCLASS_NEG := 5; |
| 10 | + our $EDGE_CHARLIST := 6; |
| 11 | + our $EDGE_CHARLIST_NEG := 7; |
| 12 | + our $EDGE_SUBRULE := 8; |
| 13 | + our $EDGE_CODEPOINT_I := 9; |
| 14 | + our $EDGE_CODEPOINT_I_NEG := 10; |
13 | 15 |
|
14 | 16 | has $!states;
|
15 | 17 | has $!edges;
|
@@ -104,15 +106,28 @@ class QRegex::NFA {
|
104 | 106 | }
|
105 | 107 |
|
106 | 108 | method literal($node, int $from, int $to) {
|
107 |
| - my str $litconst := $node[0]; |
108 |
| - my int $litlen := nqp::chars($litconst) - 1; |
| 109 | + my int $litlen := nqp::chars($node[0]) - 1; |
109 | 110 | my int $i := 0;
|
110 | 111 | if $litlen >= 0 {
|
111 |
| - while $i < $litlen { |
112 |
| - $from := self.addedge($from, -1, $EDGE_CODEPOINT, nqp::ord($litconst, $i)); |
113 |
| - $i := $i + 1; |
| 112 | + if $node.subtype eq 'ignorecase' { |
| 113 | + my str $litconst_lc := nqp::lc($node[0]); |
| 114 | + my str $litconst_uc := nqp::uc($node[0]); |
| 115 | + while $i < $litlen { |
| 116 | + $from := self.addedge($from, -1, $EDGE_CODEPOINT_I, |
| 117 | + [nqp::ord($litconst_lc, $i), nqp::ord($litconst_uc, $i)]); |
| 118 | + $i := $i + 1; |
| 119 | + } |
| 120 | + self.addedge($from, $to, $EDGE_CODEPOINT_I, |
| 121 | + [nqp::ord($litconst_lc, $i), nqp::ord($litconst_uc, $i)]); |
| 122 | + } |
| 123 | + else { |
| 124 | + my str $litconst := $node[0]; |
| 125 | + while $i < $litlen { |
| 126 | + $from := self.addedge($from, -1, $EDGE_CODEPOINT, nqp::ord($litconst, $i)); |
| 127 | + $i := $i + 1; |
| 128 | + } |
| 129 | + self.addedge($from, $to, $EDGE_CODEPOINT, nqp::ord($litconst, $i)); |
114 | 130 | }
|
115 |
| - self.addedge($from, $to, $EDGE_CODEPOINT, nqp::ord($litconst, $i)); |
116 | 131 | }
|
117 | 132 | else {
|
118 | 133 | self.addedge($from, $to, $EDGE_EPSILON, 0);
|
@@ -248,7 +263,14 @@ class QRegex::NFA {
|
248 | 263 | for $!states -> @values {
|
249 | 264 | my $list := QAST::Op.new(:op<list>);
|
250 | 265 | for @values {
|
251 |
| - if $_ ~~ QAST::SVal { |
| 266 | + if nqp::islist($_) { |
| 267 | + my $arglist := QAST::Op.new( :op('list_i') ); |
| 268 | + for $_ -> $i { |
| 269 | + $arglist.push(QAST::IVal.new( :value($i) )); |
| 270 | + } |
| 271 | + $list.push($arglist); |
| 272 | + } |
| 273 | + elsif $_ ~~ QAST::SVal { |
252 | 274 | $list.push($_);
|
253 | 275 | }
|
254 | 276 | elsif +$_ eq $_ {
|
|
0 commit comments