diff --git a/synom/src/helper.rs b/synom/src/helper.rs
index 7283e41..e4ada4b 100644
--- a/synom/src/helper.rs
+++ b/synom/src/helper.rs
@@ -1,6 +1,22 @@
 use IResult;
 use space::{skip_whitespace, word_break};
 
+/// Parse a piece of punctuation, skipping whitespace before it.
+///
+/// - **Syntax:** `punct!("...")`
+/// - **Output:** `&str`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// named!(bang -> &str, punct!("!"));
+///
+/// fn main() {
+///     let input = "   !";
+///     bang(input).expect("bang");
+/// }
+/// ```
 #[macro_export]
 macro_rules! punct {
     ($i:expr, $punct:expr) => {
@@ -19,6 +35,24 @@
     }
 }
 
+/// Parse a keyword. The word must make up a complete identifier.
+///
+/// - **Syntax:** `keyword!("...")`
+/// - **Output:** `&str`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// named!(apple -> &str, keyword!("apple"));
+///
+/// fn main() {
+///     let input = "   apple";
+///     apple(input).expect("apple");
+///     let input = "apples";
+///     assert_eq!(apple(input), synom::IResult::Error);
+/// }
+/// ```
 #[macro_export]
 macro_rules! keyword {
     ($i:expr, $keyword:expr) => {
@@ -40,6 +74,25 @@
     }
 }
 
+/// Try to run the parser and wrap it in an `Option`, if it fails, succeed but
+/// produce a `None`.
+///
+/// - **Syntax:** `option!(THING)`
+/// - **Output:** `THING`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// named!(maybe_bang -> Option<&str>, option!(punct!("!")));
+///
+/// fn main() {
+///     let input = "   !";
+///     assert_eq!(maybe_bang(input).expect("maybe bang"), Some("!"));
+///     let input = "";
+///     assert_eq!(maybe_bang(input).expect("maybe bang"), None);
+/// }
+/// ```
 #[macro_export]
 macro_rules! option {
     ($i:expr, $submac:ident!( $($args:tt)* )) => {
@@ -54,6 +107,33 @@
     };
 }
 
+/// Try to run the parser, if it fails, succeed and produce an empty Vec.
+///
+/// The argument parser must be a Vec.
+///
+/// - **Syntax:** `opt_vec!(THING)`
+/// - **Output:** `THING`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// use syn::Expr;
+/// use syn::parse::expr;
+///
+/// named!(opt_expr_list -> Vec<Expr>, opt_vec!(
+///     separated_list!(punct!(","), expr)));
+///
+/// fn main() {
+///     let input = "a, 1 + 1, Object { construct: ion }";
+///     let result = opt_expr_list(input).expect("opt expr list");
+///     assert_eq!(result.len(), 3);
+///
+///     let input = "";
+///     let result = opt_expr_list(input).expect("opt expr list");
+///     assert_eq!(result.len(), 0);
+/// }
+/// ```
 #[macro_export]
 macro_rules! opt_vec {
     ($i:expr, $submac:ident!( $($args:tt)* )) => {
@@ -64,6 +144,21 @@
     };
 }
 
+/// Parses nothing and always succeeds.
+///
+/// - **Syntax:** `epsilon!()`
+/// - **Output:** `()`
+///
+/// ```rust
+/// #[macro_use] extern crate synom;
+///
+/// named!(epsi -> (), epsilon!());
+///
+/// fn main() {
+///     let input = "";
+///     assert_eq!(epsi(input).expect("maybe bang"), ());
+/// }
+/// ```
 #[macro_export]
 macro_rules! epsilon {
     ($i:expr,) => {
@@ -71,6 +166,40 @@
     };
 }
 
+/// Run a parser, binding the result to a name, and then evaluating an
+/// expression.
+///
+/// Discards the result of the expression and parser.
+///
+/// - **Syntax:** `tap!(NAME : THING => EXPR)`
+/// - **Output:** `()`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// use syn::{Expr, ExprKind};
+/// use syn::parse::expr;
+///
+/// named!(pub expr_with_arrow_call -> Expr, do_parse!(
+///     mut e: expr >>
+///     many0!(tap!(arg: tuple!(punct!("=>"), expr) => {
+///         e = Expr {
+///             node: ExprKind::Call(Box::new(e), vec![arg.1]),
+///             attrs: Vec::new(),
+///         };
+///     })) >>
+///     (e)
+/// ));
+///
+/// fn main() {
+///     let input = "something => argument1 => argument2";
+///
+///     let result = expr_with_arrow_call(input).expect("expr with arrow call");
+///
+///     println!("result = {:?}", result);
+/// }
+/// ```
 #[macro_export]
 macro_rules! tap {
     ($i:expr, $name:ident : $submac:ident!( $($args:tt)* ) => $e:expr) => {
@@ -89,6 +218,32 @@
     };
 }
 
+/// Parses a series of things, separated by the given punctuation. Does not
+/// allow for a trailing seperator.
+///
+/// The implementation requires that the first parameter is a `punct!` macro,
+/// and the second is a named parser.
+///
+/// - **Syntax:** `separated_list!(punct!("..."), THING)`
+/// - **Output:** `Vec<THING>`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// use syn::Expr;
+/// use syn::parse::expr;
+///
+/// named!(pub expr_list -> Vec<Expr>,
+///     separated_list!(punct!(","), expr));
+///
+/// fn main() {
+///     let input = "1 + 1, things, Construct { this: thing }";
+///
+///     let result = expr_list(input).expect("expr list");
+///     assert_eq!(result.len(), 3);
+/// }
+/// ```
 #[macro_export]
 macro_rules! separated_list {
     ($i:expr, punct!($sep:expr), $f:expr) => {
@@ -96,6 +251,32 @@
     };
 }
 
+/// Parses a series of things, separated by the given punctuation. Allows for
+/// a trailing seperator.
+///
+/// The implementation requires that the first parameter is a `punct!` macro,
+/// and the second is a named parser.
+///
+/// - **Syntax:** `terminated_list!(punct!("..."), THING)`
+/// - **Output:** `Vec<THING>`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// use syn::Expr;
+/// use syn::parse::expr;
+///
+/// named!(pub expr_list -> Vec<Expr>,
+///     terminated_list!(punct!(","), expr));
+///
+/// fn main() {
+///     let input = "1 + 1, things, Construct { this: thing },";
+///
+///     let result = expr_list(input).expect("expr list");
+///     assert_eq!(result.len(), 3);
+/// }
+/// ```
 #[macro_export]
 macro_rules! terminated_list {
     ($i:expr, punct!($sep:expr), $f:expr) => {
diff --git a/synom/src/lib.rs b/synom/src/lib.rs
index 7b124b0..ce2f6ad 100644
--- a/synom/src/lib.rs
+++ b/synom/src/lib.rs
@@ -9,6 +9,7 @@
 #[doc(hidden)]
 pub mod helper;
 
+/// The result of a parser.
 #[derive(Debug, PartialEq, Eq, Clone)]
 pub enum IResult<I, O> {
     /// Parsing succeeded. The first field contains the rest of the unparsed
@@ -19,6 +20,8 @@
 }
 
 impl<'a, O> IResult<&'a str, O> {
+    /// Unwraps the result, asserting the the parse is complete. Panics with a
+    /// message based on the given string if the parse failed or is incomplete.
     pub fn expect(self, name: &str) -> O {
         match self {
             IResult::Done(mut rest, o) => {
@@ -34,6 +37,9 @@
     }
 }
 
+/// Define a function from a parser combination.
+///
+/// - **Syntax:** `named!(NAME -> TYPE, THING)`
 #[macro_export]
 macro_rules! named {
     ($name:ident -> $o:ty, $submac:ident!( $($args:tt)* )) => {
@@ -49,6 +55,34 @@
     };
 }
 
+/// Invoke the function with the passed in arguments as a parser.
+///
+/// - **Syntax:** `call!(FUNCTION, ARGS...)`
+/// - **Output:** The result of invoking the function `FUNCTION`
+///
+/// ```rust
+/// #[macro_use] extern crate synom;
+///
+/// use synom::IResult;
+///
+/// fn parse_char(input: &str, ch: char) -> IResult<&str, char> {
+///     if input.starts_with(ch) {
+///         IResult::Done(&input[ch.len_utf8()..], ch)
+///     } else {
+///         IResult::Error
+///     }
+/// }
+///
+/// named!(an_a -> char, call!(parse_char, 'a'));
+///
+/// fn main() {
+///     let input = "a";
+///
+///     let parsed = an_a(input).expect("an a");
+///
+///     println!("{:?}", parsed);
+/// }
+/// ```
 #[macro_export]
 macro_rules! call {
     ($i:expr, $fun:expr $(, $args:expr)*) => {
@@ -56,6 +90,32 @@
     };
 }
 
+/// Perform a transformation on the result of a parser.
+///
+/// - **Syntax:** `map!(THING, TRANSFORM)`
+/// - **Output:** `THING` after being transformed by `TRANSFORM`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// use syn::{Item, Ident};
+/// use syn::parse::item;
+///
+/// fn get_item_ident(item: Item) -> Ident {
+///     item.ident
+/// }
+///
+/// named!(item_ident -> Ident, map!(item, get_item_ident));
+///
+/// fn main() {
+///     let input = "fn foo() {}";
+///
+///     let parsed = item_ident(input).expect("item identifier");
+///
+///     assert_eq!(parsed.as_ref(), "foo");
+/// }
+/// ```
 #[macro_export]
 macro_rules! map {
     ($i:expr, $submac:ident!( $($args:tt)* ), $g:expr) => {
@@ -81,6 +141,27 @@
     };
 }
 
+/// Parses successfully if the passed-in parser fails to parse.
+///
+/// - **Syntax:** `not!(THING)`
+/// - **Output:** `""`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// use syn::parse::expr;
+///
+/// // Parse not an expression
+/// named!(not_an_expr -> &'static str, not!(call!(expr)));
+///
+/// fn main() {
+///     let input = "";
+///
+///     let parsed = not_an_expr(input).expect("not an expr");
+///     assert_eq!(parsed, "");
+/// }
+/// ```
 #[macro_export]
 macro_rules! not {
     ($i:expr, $submac:ident!( $($args:tt)* )) => {
@@ -92,6 +173,30 @@
 }
 
 // This is actually nom's cond_with_error.
+/// Conditionally execute the passed-in parser.
+///
+/// - **Syntax:** `cond!(CONDITION, PARSER)`
+/// - **Output:** `Option<PARSER>`
+///
+/// ```rust
+/// #[macro_use] extern crate synom;
+///
+/// named!(maybe_bang_bang -> bool,
+///     do_parse!(
+///         bang: option!(punct!("!")) >>
+///         cond!(bang.is_some(), punct!("!")) >>
+///         (bang.is_some())));
+///
+/// fn main() {
+///     let input = "";
+///     let parsed = maybe_bang_bang(input).expect("not bang bang");
+///     assert_eq!(parsed, false);
+///
+///     let input = "!!";
+///     let parsed = maybe_bang_bang(input).expect("yes bang bang");
+///     assert_eq!(parsed, true);
+/// }
+/// ```
 #[macro_export]
 macro_rules! cond {
     ($i:expr, $cond:expr, $submac:ident!( $($args:tt)* )) => {
@@ -110,6 +215,26 @@
     };
 }
 
+/// Fails with an error if CONDITION is not true. Otherwise parses PARSER
+///
+/// - **Syntax:** `cond_reduce!(CONDITION, PARSER)`
+/// - **Output:** `PARSER`
+///
+/// ```rust
+/// #[macro_use] extern crate synom;
+///
+/// named!(maybe_bang_bang -> bool,
+///     do_parse!(
+///         bang: option!(punct!("!")) >>
+///         cond!(bang.is_some(), punct!("!")) >>
+///         (bang.is_some())));
+///
+/// fn main() {
+///     let input = "!!";
+///     let parsed = maybe_bang_bang(input).expect("yes bang bang");
+///     assert_eq!(parsed, true);
+/// }
+/// ```
 #[macro_export]
 macro_rules! cond_reduce {
     ($i:expr, $cond:expr, $submac:ident!( $($args:tt)* )) => {
@@ -125,6 +250,32 @@
     };
 }
 
+/// Value preceded by another macro
+///
+/// - **Syntax:** `preceded!(OPEN, THING)`
+/// - **Output:** `THING`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// use syn::Expr;
+/// use syn::parse::expr;
+///
+/// // An expression preceded by ##.
+/// named!(pound_pound_expr -> Expr,
+///     preceded!(
+///         punct!("##"),
+///         expr));
+///
+/// fn main() {
+///     let input = "## 1 + 1";
+///
+///     let parsed = pound_pound_expr(input).expect("pound pound expr");
+///
+///     println!("{:?}", parsed);
+/// }
+/// ```
 #[macro_export]
 macro_rules! preceded {
     ($i:expr, $submac:ident!( $($args:tt)* ), $submac2:ident!( $($args2:tt)* )) => {
@@ -147,6 +298,32 @@
     };
 }
 
+/// Value followed by a terminator.
+///
+/// - **Syntax:** `terminated!(THING, CLOSE)`
+/// - **Output:** `THING`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// use syn::Expr;
+/// use syn::parse::expr;
+///
+/// // An expression terminated by ##.
+/// named!(expr_pound_pound -> Expr,
+///     terminated!(
+///         expr,
+///         punct!("##")));
+///
+/// fn main() {
+///     let input = "1 + 1 ##";
+///
+///     let parsed = expr_pound_pound(input).expect("expr pound pound");
+///
+///     println!("{:?}", parsed);
+/// }
+/// ```
 #[macro_export]
 macro_rules! terminated {
     ($i:expr, $submac:ident!( $($args:tt)* ), $submac2:ident!( $($args2:tt)* )) => {
@@ -169,6 +346,28 @@
     };
 }
 
+/// A value repeated 0 or more times.
+///
+/// - **Syntax:** `many0!(THING)`
+/// - **Output:** `Vec<THING>`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// use syn::Item;
+/// use syn::parse::item;
+///
+/// named!(items -> Vec<Item>, many0!(item));
+///
+/// fn main() {
+///     let input = "fn a() {} fn b() {}";
+///
+///     let parsed = items(input).expect("items");
+///
+///     println!("{:?}", parsed);
+/// }
+/// ```
 #[macro_export]
 macro_rules! many0 {
     ($i:expr, $submac:ident!( $($args:tt)* )) => {{
@@ -237,6 +436,32 @@
     }
 }
 
+/// look for a value without consuming it.
+///
+/// - **Syntax:** `peek!(THING)`
+/// - **Output:** `Vec<THING>`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// use syn::Ident;
+/// use syn::parse::{ident, expr};
+///
+/// named!(ident_expr -> Ident,
+///     do_parse!(
+///         i: peek!(call!(ident)) >>
+///         expr >>
+///         (i)));
+///
+/// fn main() {
+///     let input = "apple";
+///
+///     let parsed = ident_expr(input).expect("ident");
+///
+///     println!("{:?}", parsed);
+/// }
+/// ```
 #[macro_export]
 macro_rules! peek {
     ($i:expr, $submac:ident!( $($args:tt)* )) => {
@@ -456,6 +681,28 @@
     };
 }
 
+/// Run a series of parsers, and produce all of the results in a tuple.
+///
+/// - **Syntax:** `tuple!(THING1, THING2, ...)`
+/// - **Output:** `(THING1, THING2, ...)`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// use syn::Ty;
+/// use syn::parse::ty;
+///
+/// named!(two_types -> (Ty, Ty), tuple!(ty, ty));
+///
+/// fn main() {
+///     let input = "&str Map<K, V>";
+///
+///     let parsed = two_types(input).expect("two_types");
+///
+///     println!("{:?}", parsed);
+/// }
+/// ```
 #[macro_export]
 macro_rules! tuple {
     ($i:expr, $($rest:tt)*) => {
@@ -507,6 +754,32 @@
     };
 }
 
+/// Run a series of parsers, returning the result of the first one which succeeds.
+///
+/// Optionally allows for the result to be transformed.
+///
+/// - **Syntax:** `alt!(THING1 | THING2 => { FUNC } | ...)`
+/// - **Output:** Either `THING1` or `FUNC(THING2)` or ...
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// use syn::Ident;
+/// use syn::parse::ident;
+///
+/// named!(ident_or_bang -> Ident,
+///     alt!(ident |
+///          punct!("!") => { |_| "BANG".into() }));
+///
+/// fn main() {
+///     let input = "!";
+///     ident_or_bang(input).expect("ident_or_bang");
+///
+///     let input = "foo";
+///     ident_or_bang(input).expect("ident_or_bang");
+/// }
+/// ```
 #[macro_export]
 macro_rules! alt {
     ($i:expr, $e:ident | $($rest:tt)*) => {
@@ -551,6 +824,35 @@
     };
 }
 
+/// Run a series of parsers, one after another, optionally assigning the results
+/// a name. Fails if any of the parsers fail.
+///
+/// Produces the result of evaluating the final expression in brackets with all
+/// of the previously named results bound.
+///
+/// The variable bindings may be marked as `mut`.
+///
+/// - **Syntax:** `alt!(name: THING1 >> THING2 >> (RESULT))`
+/// - **Output:** `RESULT`
+///
+/// ```rust
+/// extern crate syn;
+/// #[macro_use] extern crate synom;
+///
+/// use syn::{Ident, TokenTree};
+/// use syn::parse::{ident, tt};
+///
+/// named!(simple_mac -> (Ident, TokenTree), do_parse!(
+///     name: ident >>
+///     punct!("!") >>
+///     body: tt >>
+///     ((name, body))));
+///
+/// fn main() {
+///     let input = "foo!(some, random, junk)";
+///     simple_mac(input).expect("macro");
+/// }
+/// ```
 #[macro_export]
 macro_rules! do_parse {
     ($i:expr, ( $($rest:expr),* )) => {
