1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe('Nesting lexing') do
include_examples 'lex', /(((b)))/,
0 => [:group, :capture, '(', 0, 1, 0, 0, 0],
1 => [:group, :capture, '(', 1, 2, 1, 0, 0],
2 => [:group, :capture, '(', 2, 3, 2, 0, 0],
3 => [:literal, :literal, 'b', 3, 4, 3, 0, 0],
4 => [:group, :close, ')', 4, 5, 2, 0, 0],
5 => [:group, :close, ')', 5, 6, 1, 0, 0],
6 => [:group, :close, ')', 6, 7, 0, 0, 0]
include_examples 'lex', /(\((b)\))/,
0 => [:group, :capture, '(', 0, 1, 0, 0, 0],
1 => [:escape, :group_open, '\(', 1, 3, 1, 0, 0],
2 => [:group, :capture, '(', 3, 4, 1, 0, 0],
3 => [:literal, :literal, 'b', 4, 5, 2, 0, 0],
4 => [:group, :close, ')', 5, 6, 1, 0, 0],
5 => [:escape, :group_close, '\)', 6, 8, 1, 0, 0],
6 => [:group, :close, ')', 8, 9, 0, 0, 0]
include_examples 'lex', /(?>a(?>b(?>c)))/,
0 => [:group, :atomic, '(?>', 0, 3, 0, 0, 0],
2 => [:group, :atomic, '(?>', 4, 7, 1, 0, 0],
4 => [:group, :atomic, '(?>', 8, 11, 2, 0, 0],
6 => [:group, :close, ')', 12, 13, 2, 0, 0],
7 => [:group, :close, ')', 13, 14, 1, 0, 0],
8 => [:group, :close, ')', 14, 15, 0, 0, 0]
include_examples 'lex', /(?:a(?:b(?:c)))/,
0 => [:group, :passive, '(?:', 0, 3, 0, 0, 0],
2 => [:group, :passive, '(?:', 4, 7, 1, 0, 0],
4 => [:group, :passive, '(?:', 8, 11, 2, 0, 0],
6 => [:group, :close, ')', 12, 13, 2, 0, 0],
7 => [:group, :close, ')', 13, 14, 1, 0, 0],
8 => [:group, :close, ')', 14, 15, 0, 0, 0]
include_examples 'lex', /(?=a(?!b(?<=c(?<!d))))/,
0 => [:assertion, :lookahead, '(?=', 0, 3, 0, 0, 0],
2 => [:assertion, :nlookahead, '(?!', 4, 7, 1, 0, 0],
4 => [:assertion, :lookbehind, '(?<=', 8, 12, 2, 0, 0],
6 => [:assertion, :nlookbehind, '(?<!', 13, 17, 3, 0, 0],
8 => [:group, :close, ')', 18, 19, 3, 0, 0],
9 => [:group, :close, ')', 19, 20, 2, 0, 0],
10 => [:group, :close, ')', 20, 21, 1, 0, 0],
11 => [:group, :close, ')', 21, 22, 0, 0, 0]
include_examples 'lex', /((?#a)b(?#c)d(?#e))/,
0 => [:group, :capture, '(', 0, 1, 0, 0, 0],
1 => [:group, :comment, '(?#a)', 1, 6, 1, 0, 0],
3 => [:group, :comment, '(?#c)', 7, 12, 1, 0, 0],
5 => [:group, :comment, '(?#e)', 13, 18, 1, 0, 0],
6 => [:group, :close, ')', 18, 19, 0, 0, 0]
include_examples 'lex', /a[b-e]f/,
1 => [:set, :open, '[', 1, 2, 0, 0, 0],
2 => [:literal, :literal, 'b', 2, 3, 0, 1, 0],
3 => [:set, :range, '-', 3, 4, 0, 1, 0],
4 => [:literal, :literal, 'e', 4, 5, 0, 1, 0],
5 => [:set, :close, ']', 5, 6, 0, 0, 0]
include_examples 'lex', '[[:word:]&&[^c]z]',
0 => [:set, :open, '[', 0, 1, 0, 0, 0],
1 => [:posixclass, :word, '[:word:]', 1, 9, 0, 1, 0],
2 => [:set, :intersection, '&&', 9, 11, 0, 1, 0],
3 => [:set, :open, '[', 11, 12, 0, 1, 0],
4 => [:set, :negate, '^', 12, 13, 0, 2, 0],
5 => [:literal, :literal, 'c', 13, 14, 0, 2, 0],
6 => [:set, :close, ']', 14, 15, 0, 1, 0],
7 => [:literal, :literal, 'z', 15, 16, 0, 1, 0],
8 => [:set, :close, ']', 16, 17, 0, 0, 0]
include_examples 'lex', '[\p{word}&&[^c]z]',
0 => [:set, :open, '[', 0, 1, 0, 0, 0],
1 => [:property, :word, '\p{word}', 1, 9, 0, 1, 0],
2 => [:set, :intersection, '&&', 9, 11, 0, 1, 0],
3 => [:set, :open, '[', 11, 12, 0, 1, 0],
4 => [:set, :negate, '^', 12, 13, 0, 2, 0],
5 => [:literal, :literal, 'c', 13, 14, 0, 2, 0],
6 => [:set, :close, ']', 14, 15, 0, 1, 0],
7 => [:literal, :literal, 'z', 15, 16, 0, 1, 0],
8 => [:set, :close, ']', 16, 17, 0, 0, 0]
include_examples 'lex', /[a[b[c[d-g]]]]/,
0 => [:set, :open, '[', 0, 1, 0, 0, 0],
1 => [:literal, :literal, 'a', 1, 2, 0, 1, 0],
2 => [:set, :open, '[', 2, 3, 0, 1, 0],
3 => [:literal, :literal, 'b', 3, 4, 0, 2, 0],
4 => [:set, :open, '[', 4, 5, 0, 2, 0],
5 => [:literal, :literal, 'c', 5, 6, 0, 3, 0],
6 => [:set, :open, '[', 6, 7, 0, 3, 0],
7 => [:literal, :literal, 'd', 7, 8, 0, 4, 0],
8 => [:set, :range, '-', 8, 9, 0, 4, 0],
9 => [:literal, :literal, 'g', 9, 10, 0, 4, 0],
10 => [:set, :close, ']', 10, 11, 0, 3, 0],
11 => [:set, :close, ']', 11, 12, 0, 2, 0],
12 => [:set, :close, ']', 12, 13, 0, 1, 0],
13 => [:set, :close, ']', 13, 14, 0, 0, 0]
end
|