Polish dump-ast example code
diff --git a/Cargo.toml b/Cargo.toml
index a40b5fb..af5d676 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,9 +11,9 @@
 publish = false # this branch contains breaking changes
 
 [[example]]
-name = "dump-ast"
-path = "examples/dump-ast.rs"
-required-features = ["extra-traits", "parsing", "printing", "full"]
+name = "dump-syntax"
+path = "examples/dump-syntax/main.rs"
+required-features = ["full", "parsing", "extra-traits"]
 
 [features]
 default = ["parsing", "printing", "clone-impls"]
diff --git a/examples/dump-ast.rs b/examples/dump-ast.rs
deleted file mode 100644
index 0e2f67b..0000000
--- a/examples/dump-ast.rs
+++ /dev/null
@@ -1,30 +0,0 @@
-extern crate syn;
-
-use std::env;
-use std::fs::File;
-use std::io::{self, Read};
-
-fn main() {
-    let mut args = env::args();
-    let _ = args.next(); // executable name
-    let filename = args.next().unwrap_or_else(|| {
-        panic!("USAGE: dump-ast FILENAME");
-    });
-    if args.next().is_some() {
-        panic!("dump-ast only takes one argument");
-    }
-
-    let mut src = String::new();
-    if filename != "-" {
-        let mut file = File::open(&filename).expect("Unable to open source file");
-        file.read_to_string(&mut src)
-            .expect("Unable to read input file");
-    } else {
-        io::stdin()
-            .read_to_string(&mut src)
-            .expect("Unable to read stdin");
-    }
-
-    let ast = syn::parse_file(&src).expect("Unable to parse file");
-    println!("{:#?}", ast);
-}
diff --git a/examples/dump-syntax/Cargo.toml b/examples/dump-syntax/Cargo.toml
new file mode 100644
index 0000000..39d9622
--- /dev/null
+++ b/examples/dump-syntax/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "dump-syntax"
+version = "0.0.0"
+authors = ["David Tolnay <dtolnay@gmail.com>"]
+publish = false
+
+[dependencies]
+syn = { path = "../..", features = ["full", "extra-traits"] }
+
+[[bin]]
+name = "dump-syntax"
+path = "main.rs"
diff --git a/examples/dump-syntax/README.md b/examples/dump-syntax/README.md
new file mode 100644
index 0000000..3b23736
--- /dev/null
+++ b/examples/dump-syntax/README.md
@@ -0,0 +1,28 @@
+Parse a Rust source file into a `syn::File` and print out a debug representation
+of the syntax tree.
+
+Use the following command from this directory to test this program by running it
+on its own source code:
+
+```
+cargo run -- main.rs
+```
+
+The output will begin with:
+
+```
+File {
+    shebang: None,
+    attrs: [
+        Attribute {
+            pound_token: Pound,
+            style: Inner(
+                Bang
+            ),
+            bracket_token: Bracket,
+            path: Path {
+                leading_colon: None,
+                segments: [
+    ...
+}
+```
diff --git a/examples/dump-syntax/main.rs b/examples/dump-syntax/main.rs
new file mode 100644
index 0000000..584fe3c
--- /dev/null
+++ b/examples/dump-syntax/main.rs
@@ -0,0 +1,46 @@
+//! Parse a Rust source file into a `syn::File` and print out a debug
+//! representation of the syntax tree.
+//!
+//! Use the following command from this directory to test this program by
+//! running it on its own source code:
+//!
+//!     cargo run -- main.rs
+//!
+//! The output will begin with:
+//!
+//!     File {
+//!         shebang: None,
+//!         attrs: [
+//!             Attribute {
+//!                 pound_token: Pound,
+//!                 style: Inner(
+//!         ...
+//!     }
+
+extern crate syn;
+
+use std::env;
+use std::fs::File;
+use std::io::Read;
+use std::process;
+
+fn main() {
+    let mut args = env::args();
+    let _ = args.next(); // executable name
+
+    let filename = match (args.next(), args.next()) {
+        (Some(filename), None) => filename,
+        _ => {
+            eprintln!("Usage: dump-syntax path/to/filename.rs");
+            process::exit(1);
+        }
+    };
+
+    let mut file = File::open(&filename).expect("Unable to open file");
+
+    let mut src = String::new();
+    file.read_to_string(&mut src).expect("Unable to read file");
+
+    let syntax = syn::parse_file(&src).expect("Unable to parse file");
+    println!("{:#?}", syntax);
+}