code: function() {
      var tok;
      this.skipSpaces();
  
      // Parenthesis
      if (this.accept('(')) {
        ++this.parens;
        var expr = this.expression()
          , paren = this.expect(')');
        --this.parens;
        if (this.accept('%')) expr.push(new nodes.Ident('%'));
        tok = this.peek();
        // (1 + 2)px, (1 + 2)em, etc.
        if (!paren.space
          && 'ident' == tok.type
          && ~units.indexOf(tok.val.string)) {
          expr.push(new nodes.Ident(tok.val.string));
          this.next();
        }
        return expr;
      }
  
      tok = this.peek();
  
      // Primitive
      switch (tok.type) {
        case 'null':
        case 'unit':
        case 'color':
        case 'string':
        case 'literal':
        case 'boolean':
        case 'comment':
          return this.next().val;
        case !this.cond && '{':
          return this.object();
        case 'atblock':
          return this.atblock();
        // property lookup
        case 'atrule':
          var id = new nodes.Ident(this.next().val);
          id.property = true;
          return id;
        case 'ident':
          return this.ident();
        case 'function':
          return tok.anonymous
            ? this.functionDefinition()
            : this.functionCall();
      }
    }
docs: unit
  | null
  | color
  | string
  | ident
  | boolean
  | literal
  | object
  | atblock
  | atrule
  | '(' expression ')' '%'?