Method: Bindy::Language#_nt_string

Defined in:
lib/bindy/language.rb

#_nt_stringObject



342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
# File 'lib/bindy/language.rb', line 342

def _nt_string
  start_index = index
  if node_cache[:string].has_key?(index)
    cached = node_cache[:string][index]
    if cached
      node_cache[:string][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
      @index = cached.interval.end
    end
    return cached
  end

  i0, s0 = index, []
  if (match_len = has_terminal?("'", false, index))
    r1 = true
    @index += match_len
  else
    terminal_parse_failure('"\'"')
    r1 = nil
  end
  s0 << r1
  if r1
    s2, i2 = [], index
    loop do
      if has_terminal?(@regexps[gr = '\A[\\da-zA-ZáéíóúüñÁÉÍÓÚÜÑ¿?!¡\\s\\@\\#\\$\\%\\&\\/\\\\\\*\\_\\-\\+\\/\\\\\\*\\_\\-\\+\\.\\:\\,\\;\\<\\>\\|\\"\\\\(\\)]'] ||= Regexp.new(gr), :regexp, index)
        r3 = true
        @index += 1
      else
        terminal_parse_failure('[\\da-zA-ZáéíóúüñÁÉÍÓÚÜÑ¿?!¡\\s\\@\\#\\$\\%\\&\\/\\\\\\*\\_\\-\\+\\/\\\\\\*\\_\\-\\+\\.\\:\\,\\;\\<\\>\\|\\"\\\\(\\)]')
        r3 = nil
      end
      if r3
        s2 << r3
      else
        break
      end
    end
    r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
    s0 << r2
    if r2
      if (match_len = has_terminal?("'", false, index))
        r4 = true
        @index += match_len
      else
        terminal_parse_failure('"\'"')
        r4 = nil
      end
      s0 << r4
    end
  end
  if s0.last
    r0 = instantiate_node(LiteralString,input, i0...index, s0)
    r0.extend(String0)
  else
    @index = i0
    r0 = nil
  end

  node_cache[:string][start_index] = r0

  r0
end