Class: Pdfrb::Arlington::Predicate::Lexer

Inherits:
Object
  • Object
show all
Defined in:
lib/pdfrb/arlington/predicate/lexer.rb

Overview

Tokenises the predicate mini-DSL.

fn:IsRequired(@Foo==Bar && fn:SinceVersion(2.0))

Produces a stream of Token values: [:fn_call, "fn:IsRequired"], [:lparen], [:at_key, "Foo"], [:op, "=="], [:name, "Bar"], [:logic_and], [:fn_call, "fn:SinceVersion"], [:lparen], [:version, "2.0"], [:rparen], [:rparen].

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source) ⇒ Lexer

Returns a new instance of Lexer.



17
18
19
20
21
# File 'lib/pdfrb/arlington/predicate/lexer.rb', line 17

def initialize(source)
  @source = source.to_s
  @tokens = []
  @pos = 0
end

Instance Attribute Details

#sourceObject (readonly)

Returns the value of attribute source.



15
16
17
# File 'lib/pdfrb/arlington/predicate/lexer.rb', line 15

def source
  @source
end

#tokensObject (readonly)

Returns the value of attribute tokens.



15
16
17
# File 'lib/pdfrb/arlington/predicate/lexer.rb', line 15

def tokens
  @tokens
end

Class Method Details

.tokenize(source) ⇒ Object



23
24
25
# File 'lib/pdfrb/arlington/predicate/lexer.rb', line 23

def self.tokenize(source)
  new(source).tokenize
end

Instance Method Details

#tokenizeObject



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
# File 'lib/pdfrb/arlington/predicate/lexer.rb', line 27

def tokenize
  while @pos < @source.length
    ch = peek
    if ch =~ /\s/
      advance
    elsif start_fn_call?
      scan_fn_call
    elsif ch == "@"
      scan_at_key
    elsif ch =~ /[0-9]/
      scan_number
    elsif ch == "'"
      scan_quoted_string
    elsif ch == "["
      scan_array
    elsif ch =~ /[A-Za-z_]/
      scan_name_or_path
    elsif start_two_char_op?
      scan_two_char_op
    elsif ch =~ /[!()<>,&|*+\-\/%=]/
      scan_single_char
    else
      raise Pdfrb::LexError,
            "predicate lexer: unexpected char #{ch.inspect} at pos #{@pos}"
    end
  end
  @tokens.freeze
end