# File lib/liquid/block_body.rb, line 15
    def parse(tokens, options)
      while token = tokens.shift
        begin
          unless token.empty?
            case
            when token.start_with?(TAGSTART)
              if token =~ FullToken
                tag_name = $1
                markup = $2
                # fetch the tag from registered blocks
                if tag = Template.tags[tag_name]
                  markup = token.child(markup) if token.is_a?(Token)
                  new_tag = tag.parse(tag_name, markup, tokens, options)
                  new_tag.line_number = token.line_number if token.is_a?(Token)
                  @blank &&= new_tag.blank?
                  @nodelist << new_tag
                else
                  # end parsing if we reach an unknown tag and let the caller decide
                  # determine how to proceed
                  return yield tag_name, markup
                end
              else
                raise SyntaxError.new(options[:locale].t("errors.syntax.tag_termination".freeze, :token => token, :tag_end => TagEnd.inspect))
              end
            when token.start_with?(VARSTART)
              new_var = create_variable(token, options)
              new_var.line_number = token.line_number if token.is_a?(Token)
              @nodelist << new_var
              @blank = false
            else
              @nodelist << token
              @blank &&= !!(token =~ /\A\s*\z/)
            end
          end
        rescue SyntaxError => e
          e.set_line_number_from_token(token)
          raise
        end
      end

      yield nil, nil
    end