Strict variable parsing

This is the first iteration of the strict C lexer and variable parser. Currently, there is a tight coupling between a few of the methods and Ruby, but this is expected to go away in the future.

Feel free to start reviewing, though this is heavily a WIP and we'll continue making changes tomorrow.

```
/Users/jli/.rbenv/versions/2.1.0/bin/ruby ./performance.rb bare benchmark lax

Running benchmark for 20 seconds (with 5 seconds warmup).

Calculating -------------------------------------
              parse:         4 i/100ms
-------------------------------------------------
              parse:       46.0 (±4.3%) i/s -        920 in  20.045934s
/Users/jli/.rbenv/versions/2.1.0/bin/ruby ./performance.rb c benchmark lax

Running benchmark for 20 seconds (with 5 seconds warmup).

Calculating -------------------------------------
              parse:         7 i/100ms
-------------------------------------------------
              parse:       78.7 (±2.5%) i/s -       1575 in  20.036520s
```

~40% less time spent in parsing, and is very reproducible.

Paired with @xthexder 

@Shopify/webscale @Shopify/liquid
I totally thought that was merged already. Agreed, and pease base it on that and it's ideas. 

-- Tobi
CEO Shopify

(mobile)

> On Oct 16, 2014, at 5:55 PM, Dylan Thacker-Smith <notifications@github.com> wrote:
> 
> In ext/liquid_c/parser.c:
> 
> > +
> > +        case TOKEN_QUOTE:
> > +        case TOKEN_NUMBER:
> > +            token = parser_consume_any(parser);
> > +            return rb_utf8_str_new_range(token.val, token.val_end);
> > +
> > +        case TOKEN_OPEN_ROUND:
> > +        {
> > +            parser_consume_any(parser);
> > +            VALUE first = parse_expression(parser);
> > +            parser_must_consume(parser, TOKEN_DOTDOT);
> > +            VALUE last = parse_expression(parser);
> > +            parser_must_consume(parser, TOKEN_CLOSE_ROUND);
> > +
> > +            VALUE out = rb_enc_str_new("(", 1, utf8_encoding);
> > +            rb_str_append(out, first);
> It is shame to fully parse the expression, then convert it back into a string to return. If you based your changes on Shopify/liquid#443, which I think is ready to merge, then you could return actual ruby objects like a Range in this case. We can always iterate though, so this is fine.
> 
> —
> Reply to this email directly or view it on GitHub.