# Import statements

@import url("fineprint.css") print;
@import url("bluish.css") speech;
@import 'custom.css';
@import url("chrome://communicator/skin/");
@import "common.css" screen;

==>

import.d(import.at.k, call.l(callee.name, string.l), keyword.q),
import.d(import.at.k, call.l(callee.name, string.l), keyword.q),
import.d(import.at.k, string.l),
import.d(import.at.k, call.l(callee.name, string.l)),
import.d(import.at.k, string.l, keyword.q)

# Namespace statements

/* Default namespace */
@namespace url(XML-namespace-URL);
@namespace "XML-namespace-URL";
@namespace url(http://www.w3.org/1999/xhtml);
@namespace svg url(http://www.w3.org/2000/svg);

/* Prefixed namespace */
@namespace prefix url(XML-namespace-URL);
@namespace prefix "XML-namespace-URL";

==>

block.c,
namespace.d(namespace.at.k, call.l(callee.name, parenthesized.c)),
namespace.d(namespace.at.k, string.l),
namespace.d(namespace.at.k, call.l(callee.name, parenthesized.c)),
namespace.d(namespace.at.k, namespace.definition.name, call.l(callee.name, parenthesized.c)),
block.c,
namespace.d(namespace.at.k, namespace.d, call.l(callee.name, parenthesized.c)),
namespace.d(namespace.at.k, namespace.d, string.l)

# Keyframes statements

@keyframes important1 {
  from { margin-top: 50px; }
  50%  { margin-top: 150px !important; } /* ignored */
  to   { margin-top: 100px; }
}

==>

keyframes.s(keyframes.at.k, keyframes.definition.name, keyframe.l(
  from.k, block(property.d(property.n, number.l(unit.n))),
  number.l(unit.n), block(property.d(property.n, number.l(unit.n), important.k)),
  block.c,
  to.k, block(property.d(property.n, number.l(unit.n)))))

# Media statements

@media screen and (min-width: 30em) and (orientation: landscape) {}
@media (min-height: 680px), screen and (orientation: portrait) {}
@media not all and (monochrome) {}
@media only screen {}

==>

media.s(media.at.k, binary.operator.q(binary.operator.q(keyword.q, operator.n, feature.q(feature.n, number.l(unit.n))), operator.n,
  feature.q(feature.n, value.n)), block),
media.s(media.at.k, feature.q(feature.n, number.l(unit.n)),
  binary.operator.q(keyword.q, operator.n, feature.q(feature.n, value.n)), block),
media.s(media.at.k, unary.operator.q(operator.k, binary.operator.q(keyword.q, operator.n, parenthesized.q(keyword.q))), block),
media.s(media.at.k, unary.operator.q(operator.k, keyword.q), block)

# Supports statements

@supports (animation-name: test) {
  div { animation-name: test; }
}
@supports (transform-style: preserve) or (-moz-transform-style: preserve) {}
@supports not ((text-align-last: justify) or (-moz-text-align-last: justify)) {}
@supports not selector(:matches(a, b)) {}

==>

supports.d(supports.at.k, feature.q(feature.n, value.n), block(
  ruleSet.d(tag.name.selector, block(property.d(property.n, value.n))))),
supports.d(supports.at.k, binary.operator.q(feature.q(feature.n, value.n), operator.n, feature.q(feature.n, value.n)), block),
supports.d(supports.at.k, unary.operator.q(operator.k, parenthesized.q(binary.operator.q(feature.q(feature.n, value.n),
  operator.n, feature.q(feature.n, value.n)))), block),
supports.d(supports.at.k, unary.operator.q(operator.k, selector.q(selector.k, pseudoClass.s(pseudoClass.n, argument.list(value.n, value.n)))), block)

# Charset statements

@charset "utf-8";

==>

charset.d(charset.at.k, string.l)

# Other at-statements

@font-face {
  font-family: "Open Sans";
  src: url("/a") format("woff2"), url("/b/c") format("woff");
}

==>

atRule.s(at.k, block(
  property.d(property.n, string.l),
  property.d(property.n, call.l(callee.name, string.l), call.e(callee.name, argument.list(string.l)),
    call.l(callee.name, string.l), call.e(callee.name, argument.list(string.l)))))
