Update Parser trait to look like Parse
diff --git a/src/lib.rs b/src/lib.rs
index f3b13a1..51a7952 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -662,10 +662,7 @@
     feature = "parsing",
     feature = "proc-macro"
 ))]
-pub fn parse<T>(tokens: proc_macro::TokenStream) -> Result<T, Error>
-where
-    T: Synom,
-{
+pub fn parse<T: parse::Parse>(tokens: proc_macro::TokenStream) -> Result<T, Error> {
     parse2(tokens.into())
 }
 
@@ -682,10 +679,7 @@
 ///
 /// *This function is available if Syn is built with the `"parsing"` feature.*
 #[cfg(feature = "parsing")]
-pub fn parse2<T>(tokens: proc_macro2::TokenStream) -> Result<T, Error>
-where
-    T: Synom,
-{
+pub fn parse2<T: parse::Parse>(tokens: proc_macro2::TokenStream) -> Result<T, Error> {
     let parser = T::parse;
     parser.parse2(tokens).map_err(|err| match T::description() {
         Some(s) => Error::new(Span::call_site(), format!("failed to parse {}: {}", s, err)),
@@ -722,7 +716,7 @@
 /// # fn main() { run().unwrap() }
 /// ```
 #[cfg(feature = "parsing")]
-pub fn parse_str<T: Synom>(s: &str) -> Result<T, Error> {
+pub fn parse_str<T: parse::Parse>(s: &str) -> Result<T, Error> {
     match s.parse() {
         Ok(tts) => parse2(tts),
         Err(_) => Err(Error::new(
diff --git a/src/lit.rs b/src/lit.rs
index 5b2bf86..1b9efac 100644
--- a/src/lit.rs
+++ b/src/lit.rs
@@ -15,7 +15,7 @@
 #[cfg(feature = "parsing")]
 use proc_macro2::TokenStream;
 #[cfg(feature = "parsing")]
-use {Error, Synom};
+use Error;
 
 use proc_macro2::TokenTree;
 
@@ -24,6 +24,8 @@
 
 #[cfg(feature = "parsing")]
 use lookahead;
+#[cfg(feature = "parsing")]
+use parse::Parse;
 
 ast_enum_of_structs! {
     /// A Rust literal such as a string or integer or boolean.
@@ -125,7 +127,7 @@
     ///
     /// All spans in the syntax tree will point to the span of this `LitStr`.
     #[cfg(feature = "parsing")]
-    pub fn parse<T: Synom>(&self) -> Result<T, Error> {
+    pub fn parse<T: Parse>(&self) -> Result<T, Error> {
         use proc_macro2::Group;
 
         // Parse string literal into a token stream with every span equal to the
diff --git a/src/parse_quote.rs b/src/parse_quote.rs
index 072b4f7..9d65555 100644
--- a/src/parse_quote.rs
+++ b/src/parse_quote.rs
@@ -88,8 +88,9 @@
 ////////////////////////////////////////////////////////////////////////////////
 // Can parse any type that implements Synom.
 
-use proc_macro2::TokenStream;
 use parse::{Parse, ParseStream, Result};
+use proc_macro2::TokenStream;
+use synom::Parser;
 
 // Not public API.
 #[doc(hidden)]
diff --git a/src/synom.rs b/src/synom.rs
index 035b770..e39a534 100644
--- a/src/synom.rs
+++ b/src/synom.rs
@@ -313,21 +313,17 @@
 
 impl<F, T> Parser for F
 where
-    F: FnOnce(Cursor) -> PResult<T>,
+    F: FnOnce(ParseStream) -> Result<T>,
 {
     type Output = T;
 
     fn parse2(self, tokens: TokenStream) -> Result<T> {
         let buf = TokenBuffer::new2(tokens);
-        let (t, rest) = self(buf.begin())?;
-        if rest.eof() {
-            Ok(t)
-        } else if rest == buf.begin() {
-            // parsed nothing
-            Err(Error::new(Span::call_site(), "failed to parse anything"))
-        } else {
-            Err(Error::new(Span::call_site(), "failed to parse all tokens"))
-        }
+        let unexpected = Rc::new(Cell::new(None));
+        let state = ParseBuffer::new(Span::call_site(), buf.begin(), unexpected);
+        let node = self(&state)?;
+        state.check_unexpected()?;
+        Ok(node)
     }
 }