Class: Pdfrb::Arlington::Predicate::Lexer
- Inherits:
-
Object
- Object
- Pdfrb::Arlington::Predicate::Lexer
- 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
-
#source ⇒ Object
readonly
Returns the value of attribute source.
-
#tokens ⇒ Object
readonly
Returns the value of attribute tokens.
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(source) ⇒ Lexer
constructor
A new instance of Lexer.
- #tokenize ⇒ Object
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
#source ⇒ Object (readonly)
Returns the value of attribute source.
15 16 17 |
# File 'lib/pdfrb/arlington/predicate/lexer.rb', line 15 def source @source end |
#tokens ⇒ Object (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
#tokenize ⇒ Object
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 |