Sha256: 334ed2d258da53e633a388435ff2fab6a3baa815bf1817bcbb9f01c71451c978

Contents?: true

Size: 1.76 KB

Versions: 33

Compression:

Stored size: 1.76 KB

Contents

module Liquidscript
  module Scanner
    class Base
      module Lexer

        def perform_with_context(context, scanner = @scanner)
          key, value = context.find_matcher(scanner)

          if value.nil? && scanner.rest?
            error scanner, context
          end

          normalize_action key, value, scanner if scanner.rest?
        end

        def lex(*args)
          args.flatten!
          to_lex = args.pop

          context, body = if to_lex.is_a? Hash
            to_lex.to_a.first
          else
            [to_lex, nil]
          end

          scanner = if body
            StringScanner.new(body)
          else
            @scanner
          end
          out = []

          context = find_context(context)
          instance_exec(*args, &context.init)

          while scanner.rest? && out.last != EXIT
            out << perform_with_context(context, scanner)
          end

          out
        end

        def error(scanner = @scanner, context = @context)
          raise SyntaxError, "Unexpected " +
            "#{scanner.matched}#{scanner.peek(2)}".inspect +
            " (line: #{line}, column: #{column})"
        end

        private

        def find_context(name)
          context = contexts.dup.keep_if { |c|
            c.name == name
          }.to_a.first

          if context.nil?
            raise NoContextError.new(name)
          end

          context
        end

        def exit
          EXIT
        end

        def normalize_action(key, value, scanner)
          body = scanner.scan(key)

          case value
          when Proc
            instance_exec(*body.match(key), &value)
          when Symbol
            lex(*body.match(key), value)
          when EXIT
            EXIT
          end
        end

      end
    end
  end
end

Version data entries

33 entries across 33 versions & 1 rubygems

Version Path
liquidscript-0.11.0.rc1 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.10.4 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.10.3 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.10.2 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.10.1 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.10.0 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.9.2 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.9.1 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.9.0 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.8.2 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.8.1 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.8.0 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.7.12 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.7.11 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.7.10 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.7.9 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.7.8 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.7.7 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.7.6 lib/liquidscript/scanner/base/lexer.rb
liquidscript-0.7.5 lib/liquidscript/scanner/base/lexer.rb