Limit expression parsing in non-full builds
diff --git a/src/macros.rs b/src/macros.rs
index bd686ac..69a405e 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -1,13 +1,32 @@
 macro_rules! ast_struct {
     (
         $(#[$attr:meta])*
+        pub struct $name:ident #full $($rest:tt)*
+    ) => {
+        #[cfg(feature = "full")]
+        $(#[$attr])*
+        #[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
+        #[cfg_attr(feature = "clone-impls", derive(Clone))]
+        pub struct $name $($rest)*
+
+        #[cfg(not(feature = "full"))]
+        $(#[$attr])*
+        #[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
+        #[cfg_attr(feature = "clone-impls", derive(Clone))]
+        pub struct $name {
+            _noconstruct: (),
+        }
+    };
+
+    (
+        $(#[$attr:meta])*
         pub struct $name:ident $($rest:tt)*
     ) => {
         $(#[$attr])*
         #[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
         #[cfg_attr(feature = "clone-impls", derive(Clone))]
         pub struct $name $($rest)*
-    }
+    };
 }
 
 macro_rules! ast_enum {
@@ -61,7 +80,7 @@
 
         generate_to_tokens! {
             $($remaining)*
-            enum $name { $($variant,)* }
+            enum $name { $($variant [$($rest)*],)* }
         }
     )
 }
@@ -69,18 +88,37 @@
 macro_rules! generate_to_tokens {
     (do_not_generate_to_tokens $($foo:tt)*) => ();
 
-    (enum $name:ident { $($variant:ident,)* }) => (
+    (enum $name:ident { $($variant:ident [$($rest:tt)*],)* }) => (
         #[cfg(feature = "printing")]
         impl ::quote::ToTokens for $name {
             fn to_tokens(&self, tokens: &mut ::quote::Tokens) {
                 match *self {
                     $(
-                        $name::$variant(ref e) => e.to_tokens(tokens),
+                        $name::$variant(ref _e) =>
+                            to_tokens_call!(_e, tokens, $($rest)*),
                     )*
                 }
             }
         }
-    )
+    );
+}
+
+#[cfg(feature = "full")]
+macro_rules! to_tokens_call {
+    ($e:ident, $tokens:ident, $($rest:tt)*) => {
+        $e.to_tokens($tokens)
+    };
+}
+
+#[cfg(not(feature = "full"))]
+macro_rules! to_tokens_call {
+    // If the variant is marked as #full, don't auto-generate to-tokens for it.
+    ($e:ident, $tokens:ident, #full $($rest:tt)*) => {
+        unreachable!()
+    };
+    ($e:ident, $tokens:ident, $($rest:tt)*) => {
+        $e.to_tokens($tokens)
+    };
 }
 
 macro_rules! maybe_ast_struct {