Commits

Georg Brandl committed e122d42

Add Python license info, add parse.c source generated by Cython.

Comments (0)

Files changed (6)

-Copyright (c) 2007-2008 by the respective authors (see AUTHORS file).
-All rights reserved.
+Copyright (c) 2007-2008 by the Sphinx team (see AUTHORS file).  All
+rights reserved.
+
+License for Sphinx
+==================
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
 
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions and the following disclaimer.
 
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Licenses for incorporated software
+==================================
+
+The pgen2 package, included in this distribution under the name
+sphinx.pycode.pgen2, is available in the Python 2.6 distribution under
+the PSF license agreement for Python:
+
+1. This LICENSE AGREEMENT is between the Python Software Foundation
+   ("PSF"), and the Individual or Organization ("Licensee") accessing
+   and otherwise using Python 2.6 software in source or binary form
+   and its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, PSF
+   hereby grants Licensee a nonexclusive, royalty-free, world-wide
+   license to reproduce, analyze, test, perform and/or display
+   publicly, prepare derivative works, distribute, and otherwise use
+   Python 2.6 alone or in any derivative version, provided, however,
+   that PSF's License Agreement and PSF's notice of copyright, i.e.,
+   "Copyright © 2001-2008 Python Software Foundation; All Rights
+   Reserved" are retained in Python 2.6 alone or in any derivative
+   version prepared by Licensee.
+
+3. In the event Licensee prepares a derivative work that is based on
+   or incorporates Python 2.6 or any part thereof, and wants to make
+   the derivative work available to others as provided herein, then
+   Licensee hereby agrees to include in any such work a brief summary
+   of the changes made to Python 2.6.
+
+4. PSF is making Python 2.6 available to Licensee on an "AS IS" basis.
+   PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY
+   WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY
+   REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY
+   PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.6 WILL NOT INFRINGE
+   ANY THIRD PARTY RIGHTS.
+
+5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+   2.6 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
+   AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON
+   2.6, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY
+   THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+   breach of its terms and conditions.
+
+7. Nothing in this License Agreement shall be deemed to create any
+   relationship of agency, partnership, or joint venture between PSF
+   and Licensee.  This License Agreement does not grant permission to
+   use PSF trademarks or trade name in a trademark sense to endorse or
+   promote products or services of Licensee, or any third party.
+
+8. By copying, installing or otherwise using Python 2.6, Licensee
+   agrees to be bound by the terms and conditions of this License
+   Agreement.

sphinx/pycode/__init__.py

 
     Utilities parsing and analyzing Python code.
 
-    :copyright: 2008 by Georg Brandl.
+    :copyright: 2008-2009 by Georg Brandl.
     :license: BSD, see LICENSE for details.
 """
 
 from os import path
 from cStringIO import StringIO
 
-from sphinx.pycode import pytree
+from sphinx.pycode import nodes
 from sphinx.pycode.pgen2 import driver, token, tokenize, parse, literals
 from sphinx.util.docstrings import prepare_docstring, prepare_commentdoc
 
 # load the Python grammar
 _grammarfile = path.join(path.dirname(__file__), 'Grammar.txt')
 pygrammar = driver.load_grammar(_grammarfile)
-pydriver = driver.Driver(pygrammar, convert=pytree.convert)
+pydriver = driver.Driver(pygrammar, convert=nodes.convert)
 
 # an object with attributes corresponding to token and symbol names
 class sym: pass
 number2name.update(token.tok_name)
 
 
-_eq = pytree.Leaf(token.EQUAL, '=')
+_eq = nodes.Leaf(token.EQUAL, '=')
 
 
-class AttrDocVisitor(pytree.NodeVisitor):
+class AttrDocVisitor(nodes.NodeVisitor):
     """
     Visitor that collects docstrings for attribute assignments on toplevel and
     in classes.
     #    print '\n'.join(doc)
     pprint.pprint(ma.find_tags())
     x3 = time.time()
-    #print pytree.nice_repr(ma.parsetree, number2name)
+    #print nodes.nice_repr(ma.parsetree, number2name)
     print "tokenizing %.4f, parsing %.4f, finding %.4f" % (x1-x0, x2-x1, x3-x2)

sphinx/pycode/nodes.py

+# -*- coding: utf-8 -*-
+"""
+    sphinx.pycode.nodes
+    ~~~~~~~~~~~~~~~~~~~
+
+    Parse tree node implementations.
+
+    :copyright: 2009 by Georg Brandl.
+    :license: BSD, see LICENSE for details.
+"""
+
+
+class BaseNode(object):
+    """
+    Node superclass for both terminal and nonterminal nodes.
+    """
+
+    def _eq(self, other):
+        raise NotImplementedError
+
+    def __eq__(self, other):
+        if self.__class__ is not other.__class__:
+            return NotImplemented
+        return self._eq(other)
+
+    def __ne__(self, other):
+        if self.__class__ is not other.__class__:
+            return NotImplemented
+        return not self._eq(other)
+
+    def get_prev_sibling(self):
+        """Return previous child in parent's children, or None."""
+        if self.parent is None:
+            return None
+        for i, child in enumerate(self.parent.children):
+            if child is self:
+                if i == 0:
+                    return None
+                return self.parent.children[i-1]
+
+    def get_next_sibling(self):
+        """Return next child in parent's children, or None."""
+        if self.parent is None:
+            return None
+        for i, child in enumerate(self.parent.children):
+            if child is self:
+                try:
+                    return self.parent.children[i+1]
+                except IndexError:
+                    return None
+
+    def get_prev_leaf(self):
+        """Return the leaf node that precedes this node in the parse tree."""
+        def last_child(node):
+            if isinstance(node, Leaf):
+                return node
+            elif not node.children:
+                return None
+            else:
+                return last_child(node.children[-1])
+        if self.parent is None:
+            return None
+        prev = self.get_prev_sibling()
+        if isinstance(prev, Leaf):
+            return prev
+        elif prev is not None:
+            return last_child(prev)
+        return self.parent.get_prev_leaf()
+
+    def get_next_leaf(self):
+        """Return self if leaf, otherwise the leaf node that succeeds this
+        node in the parse tree.
+        """
+        node = self
+        while not isinstance(node, Leaf):
+            assert node.children
+            node = node.children[0]
+        return node
+
+    def get_lineno(self):
+        """Return the line number which generated the invocant node."""
+        return self.get_next_leaf().lineno
+
+    def get_prefix(self):
+        """Return the prefix of the next leaf node."""
+        # only leaves carry a prefix
+        return self.get_next_leaf().prefix
+
+
+class Node(BaseNode):
+    """
+    Node implementation for nonterminals.
+    """
+
+    def __init__(self, type, children, context=None):
+        # type of nonterminals is >= 256
+        # assert type >= 256, type
+        self.type = type
+        self.children = list(children)
+        for ch in self.children:
+            # assert ch.parent is None, repr(ch)
+            ch.parent = self
+
+    def __repr__(self):
+        return '%s(%s, %r)' % (self.__class__.__name__, self.type, self.children)
+
+    def __str__(self):
+        """This reproduces the input source exactly."""
+        return ''.join(map(str, self.children))
+
+    def _eq(self, other):
+        return (self.type, self.children) == (other.type, other.children)
+
+    # support indexing the node directly instead of .children
+
+    def __getitem__(self, index):
+        return self.children[index]
+
+    def __iter__(self):
+        return iter(self.children)
+
+    def __len__(self):
+        return len(self.children)
+
+
+class Leaf(BaseNode):
+    """
+    Node implementation for leaf nodes (terminals).
+    """
+    prefix = ''  # Whitespace and comments preceding this token in the input
+    lineno = 0   # Line where this token starts in the input
+    column = 0   # Column where this token tarts in the input
+
+    def __init__(self, type, value, context=None):
+        # type of terminals is below 256
+        # assert 0 <= type < 256, type
+        self.type = type
+        self.value = value
+        if context is not None:
+            self.prefix, (self.lineno, self.column) = context
+
+    def __repr__(self):
+        return '%s(%r, %r, %r)' % (self.__class__.__name__,
+                                   self.type, self.value, self.prefix)
+
+    def __str__(self):
+        """This reproduces the input source exactly."""
+        return self.prefix + str(self.value)
+
+    def _eq(self, other):
+        """Compares two nodes for equality."""
+        return (self.type, self.value) == (other.type, other.value)
+
+
+def convert(grammar, raw_node):
+    """Convert raw node to a Node or Leaf instance."""
+    type, value, context, children = raw_node
+    if children or type in grammar.number2symbol:
+        # If there's exactly one child, return that child instead of
+        # creating a new node.
+        if len(children) == 1:
+            return children[0]
+        return Node(type, children, context=context)
+    else:
+        return Leaf(type, value, context=context)
+
+
+def nice_repr(node, number2name, prefix=False):
+    def _repr(node):
+        if isinstance(node, Leaf):
+            return "%s(%r)" % (number2name[node.type], node.value)
+        else:
+            return "%s(%s)" % (number2name[node.type],
+                               ', '.join(map(_repr, node.children)))
+    def _prepr(node):
+        if isinstance(node, Leaf):
+            return "%s(%r, %r)" % (number2name[node.type], node.prefix, node.value)
+        else:
+            return "%s(%s)" % (number2name[node.type],
+                               ', '.join(map(_prepr, node.children)))
+    return (prefix and _prepr or _repr)(node)
+
+
+class NodeVisitor(object):
+    def __init__(self, number2name, *args):
+        self.number2name = number2name
+        self.init(*args)
+
+    def init(self, *args):
+        pass
+
+    def visit(self, node):
+        """Visit a node."""
+        method = 'visit_' + self.number2name[node.type]
+        visitor = getattr(self, method, self.generic_visit)
+        return visitor(node)
+
+    def generic_visit(self, node):
+        """Called if no explicit visitor function exists for a node."""
+        if isinstance(node, Node):
+            for child in node:
+                self.visit(child)

sphinx/pycode/pgen2/parse.c

+/* Generated by Cython 0.9.8.1 on Thu Jan  1 23:45:38 2009 */
+
+#define PY_SSIZE_T_CLEAN
+#include "Python.h"
+#include "structmember.h"
+#ifndef PY_LONG_LONG
+  #define PY_LONG_LONG LONG_LONG
+#endif
+#ifndef DL_EXPORT
+  #define DL_EXPORT(t) t
+#endif
+#if PY_VERSION_HEX < 0x02040000
+  #define METH_COEXIST 0
+#endif
+#if PY_VERSION_HEX < 0x02050000
+  typedef int Py_ssize_t;
+  #define PY_SSIZE_T_MAX INT_MAX
+  #define PY_SSIZE_T_MIN INT_MIN
+  #define PyInt_FromSsize_t(z) PyInt_FromLong(z)
+  #define PyInt_AsSsize_t(o)   PyInt_AsLong(o)
+  #define PyNumber_Index(o)    PyNumber_Int(o)
+  #define PyIndex_Check(o)     PyNumber_Check(o)
+#endif
+#if PY_VERSION_HEX < 0x02060000
+  #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
+  #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)
+  #define Py_SIZE(ob)   (((PyVarObject*)(ob))->ob_size)
+  #define PyVarObject_HEAD_INIT(type, size) \
+          PyObject_HEAD_INIT(type) size,
+  #define PyType_Modified(t)
+
+  typedef struct {
+       void *buf;
+       Py_ssize_t len;
+       int readonly;
+       const char *format;
+       int ndim;
+       Py_ssize_t *shape;
+       Py_ssize_t *strides;
+       Py_ssize_t *suboffsets;
+       Py_ssize_t itemsize;
+       void *internal;
+  } Py_buffer;
+
+  #define PyBUF_SIMPLE 0
+  #define PyBUF_WRITABLE 0x0001
+  #define PyBUF_LOCK 0x0002
+  #define PyBUF_FORMAT 0x0004
+  #define PyBUF_ND 0x0008
+  #define PyBUF_STRIDES (0x0010 | PyBUF_ND)
+  #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)
+  #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
+  #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
+  #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
+
+#endif
+#if PY_MAJOR_VERSION < 3
+  #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
+#else
+  #define __Pyx_BUILTIN_MODULE_NAME "builtins"
+#endif
+#if PY_MAJOR_VERSION >= 3
+  #define Py_TPFLAGS_CHECKTYPES 0
+  #define Py_TPFLAGS_HAVE_INDEX 0
+#endif
+#if PY_MAJOR_VERSION >= 3
+  #define PyBaseString_Type            PyUnicode_Type
+  #define PyString_Type                PyBytes_Type
+  #define PyInt_Type                   PyLong_Type
+  #define PyInt_Check(op)              PyLong_Check(op)
+  #define PyInt_CheckExact(op)         PyLong_CheckExact(op)
+  #define PyInt_FromString             PyLong_FromString
+  #define PyInt_FromUnicode            PyLong_FromUnicode
+  #define PyInt_FromLong               PyLong_FromLong
+  #define PyInt_FromSize_t             PyLong_FromSize_t
+  #define PyInt_FromSsize_t            PyLong_FromSsize_t
+  #define PyInt_AsLong                 PyLong_AsLong
+  #define PyInt_AS_LONG                PyLong_AS_LONG
+  #define PyInt_AsSsize_t              PyLong_AsSsize_t
+  #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
+  #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
+#else
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
+  #define PyBytes_Type                 PyString_Type
+#endif
+#if PY_MAJOR_VERSION >= 3
+  #define PyMethod_New(func, self, klass) PyInstanceMethod_New(func)
+#endif
+#if !defined(WIN32) && !defined(MS_WINDOWS)
+  #ifndef __stdcall
+    #define __stdcall
+  #endif
+  #ifndef __cdecl
+    #define __cdecl
+  #endif
+#else
+  #define _USE_MATH_DEFINES
+#endif
+#ifdef __cplusplus
+#define __PYX_EXTERN_C extern "C"
+#else
+#define __PYX_EXTERN_C extern
+#endif
+#include <math.h>
+#define __PYX_HAVE_API__sphinx__pycode__pgen2__parse
+
+
+#ifdef __GNUC__
+#define INLINE __inline__
+#elif _WIN32
+#define INLINE __inline
+#else
+#define INLINE 
+#endif
+
+typedef struct {PyObject **p; char *s; long n; char is_unicode; char intern; char is_identifier;} __Pyx_StringTabEntry; /*proto*/
+
+
+
+static int __pyx_skip_dispatch = 0;
+
+
+/* Type Conversion Predeclarations */
+
+#if PY_MAJOR_VERSION < 3
+#define __Pyx_PyBytes_FromString PyString_FromString
+#define __Pyx_PyBytes_AsString   PyString_AsString
+#else
+#define __Pyx_PyBytes_FromString PyBytes_FromString
+#define __Pyx_PyBytes_AsString   PyBytes_AsString
+#endif
+
+#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
+static INLINE int __Pyx_PyObject_IsTrue(PyObject* x);
+static INLINE PY_LONG_LONG __pyx_PyInt_AsLongLong(PyObject* x);
+static INLINE unsigned PY_LONG_LONG __pyx_PyInt_AsUnsignedLongLong(PyObject* x);
+static INLINE Py_ssize_t __pyx_PyIndex_AsSsize_t(PyObject* b);
+
+#define __pyx_PyInt_AsLong(x) (PyInt_CheckExact(x) ? PyInt_AS_LONG(x) : PyInt_AsLong(x))
+#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
+
+static INLINE unsigned char __pyx_PyInt_unsigned_char(PyObject* x);
+static INLINE unsigned short __pyx_PyInt_unsigned_short(PyObject* x);
+static INLINE char __pyx_PyInt_char(PyObject* x);
+static INLINE short __pyx_PyInt_short(PyObject* x);
+static INLINE int __pyx_PyInt_int(PyObject* x);
+static INLINE long __pyx_PyInt_long(PyObject* x);
+static INLINE signed char __pyx_PyInt_signed_char(PyObject* x);
+static INLINE signed short __pyx_PyInt_signed_short(PyObject* x);
+static INLINE signed int __pyx_PyInt_signed_int(PyObject* x);
+static INLINE signed long __pyx_PyInt_signed_long(PyObject* x);
+static INLINE long double __pyx_PyInt_long_double(PyObject* x);
+#ifdef __GNUC__
+/* Test for GCC > 2.95 */
+#if __GNUC__ > 2 ||               (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) 
+#define likely(x)   __builtin_expect(!!(x), 1)
+#define unlikely(x) __builtin_expect(!!(x), 0)
+#else /* __GNUC__ > 2 ... */
+#define likely(x)   (x)
+#define unlikely(x) (x)
+#endif /* __GNUC__ > 2 ... */
+#else /* __GNUC__ */
+#define likely(x)   (x)
+#define unlikely(x) (x)
+#endif /* __GNUC__ */
+    
+static PyObject *__pyx_m;
+static PyObject *__pyx_b;
+static PyObject *__pyx_empty_tuple;
+static int __pyx_lineno;
+static int __pyx_clineno = 0;
+static const char * __pyx_cfilenm= __FILE__;
+static const char *__pyx_filename;
+static const char **__pyx_f;
+
+static INLINE void __Pyx_RaiseArgtupleTooLong(Py_ssize_t num_expected, Py_ssize_t num_found); /*proto*/
+
+static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/
+
+static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
+
+static PyObject *__Pyx_CreateClass(PyObject *bases, PyObject *dict, PyObject *name, char *modname); /*proto*/
+
+static INLINE PyObject *__Pyx_GetItemInt(PyObject *o, Py_ssize_t i, int is_unsigned) {
+    PyObject *r;
+    if (PyList_CheckExact(o) && 0 <= i && i < PyList_GET_SIZE(o)) {
+        r = PyList_GET_ITEM(o, i);
+        Py_INCREF(r);
+    }
+    else if (PyTuple_CheckExact(o) && 0 <= i && i < PyTuple_GET_SIZE(o)) {
+        r = PyTuple_GET_ITEM(o, i);
+        Py_INCREF(r);
+    }
+    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0) || !is_unsigned))
+        r = PySequence_GetItem(o, i);
+    else {
+        PyObject *j = (likely(i >= 0) || !is_unsigned) ? PyInt_FromLong(i) : PyLong_FromUnsignedLongLong((sizeof(unsigned long long) > sizeof(Py_ssize_t) ? (1ULL << (sizeof(Py_ssize_t)*8)) : 0) + i);
+        if (!j)
+            return 0;
+        r = PyObject_GetItem(o, j);
+        Py_DECREF(j);
+    }
+    return r;
+}
+
+static PyObject *__Pyx_UnpackItem(PyObject *, Py_ssize_t index); /*proto*/
+static int __Pyx_EndUnpack(PyObject *); /*proto*/
+
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
+
+static INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
+    if (likely(PyList_CheckExact(L))) {
+        if (PyList_Append(L, x) < 0) return NULL;
+        Py_INCREF(Py_None);
+        return Py_None; // this is just to have an accurate signature
+    }
+    else {
+        return PyObject_CallMethod(L, "append", "(O)", x);
+    }
+}
+
+static INLINE int __Pyx_SetItemInt(PyObject *o, Py_ssize_t i, PyObject *v, int is_unsigned) {
+    int r;
+    if (PyList_CheckExact(o) && 0 <= i && i < PyList_GET_SIZE(o)) {
+        Py_DECREF(PyList_GET_ITEM(o, i));
+        Py_INCREF(v);
+        PyList_SET_ITEM(o, i, v);
+        return 1;
+    }
+    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_ass_item && (likely(i >= 0) || !is_unsigned))
+        r = PySequence_SetItem(o, i, v);
+    else {
+        PyObject *j = (likely(i >= 0) || !is_unsigned) ? PyInt_FromLong(i) : PyLong_FromUnsignedLongLong((sizeof(unsigned long long) > sizeof(Py_ssize_t) ? (1ULL << (sizeof(Py_ssize_t)*8)) : 0) + i);
+        if (!j)
+            return -1;
+        r = PyObject_SetItem(o, j, v);
+        Py_DECREF(j);
+    }
+    return r;
+}
+
+static void __Pyx_WriteUnraisable(const char *name); /*proto*/
+
+static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/
+
+static void __Pyx_AddTraceback(const char *funcname); /*proto*/
+
+static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
+
+/* Type declarations */
+
+/* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":31
+ * 
+ * 
+ * cdef class Parser:             # <<<<<<<<<<<<<<
+ *     cdef public grammar, stack, rootnode, used_names
+ *     cdef _grammar_dfas, _grammar_labels, _grammar_keywords, _grammar_tokens
+ */
+
+struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_6sphinx_6pycode_5pgen2_5parse_Parser *__pyx_vtab;
+  PyObject *grammar;
+  PyObject *stack;
+  PyObject *rootnode;
+  PyObject *used_names;
+  PyObject *_grammar_dfas;
+  PyObject *_grammar_labels;
+  PyObject *_grammar_keywords;
+  PyObject *_grammar_tokens;
+  PyObject *_grammar_number2symbol;
+};
+
+
+struct __pyx_vtabstruct_6sphinx_6pycode_5pgen2_5parse_Parser {
+  int (*classify)(struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *, PyObject *, PyObject *, PyObject *);
+  void (*shift)(struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *, PyObject *, PyObject *, PyObject *, PyObject *);
+  void (*push)(struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *, PyObject *, PyObject *, PyObject *, PyObject *);
+  void (*pop)(struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *);
+  PyObject *(*convert)(struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *, PyObject *);
+};
+static struct __pyx_vtabstruct_6sphinx_6pycode_5pgen2_5parse_Parser *__pyx_vtabptr_6sphinx_6pycode_5pgen2_5parse_Parser;
+/* Module declarations from sphinx.pycode.pgen2.parse */
+
+static PyTypeObject *__pyx_ptype_6sphinx_6pycode_5pgen2_5parse_Parser = 0;
+
+
+/* Implementation of sphinx.pycode.pgen2.parse */
+static char __pyx_k_2[] = "Exception to signal the parser is stuck.";
+static PyObject *__pyx_int_0;
+static PyObject *__pyx_int_1;
+static char __pyx_k___init__[] = "__init__";
+static PyObject *__pyx_kp___init__;
+static char __pyx_k_setup[] = "setup";
+static PyObject *__pyx_kp_setup;
+static char __pyx_k_addtoken[] = "addtoken";
+static PyObject *__pyx_kp_addtoken;
+static char __pyx_k_1[] = "sphinx.pycode.nodes";
+static PyObject *__pyx_kp_1;
+static char __pyx_k_Node[] = "Node";
+static PyObject *__pyx_kp_Node;
+static char __pyx_k_Leaf[] = "Leaf";
+static PyObject *__pyx_kp_Leaf;
+static char __pyx_k_ParseError[] = "ParseError";
+static PyObject *__pyx_kp_ParseError;
+static char __pyx_k_Exception[] = "Exception";
+static PyObject *__pyx_kp_Exception;
+static char __pyx_k_msg[] = "msg";
+static PyObject *__pyx_kp_msg;
+static char __pyx_k_type[] = "type";
+static PyObject *__pyx_kp_type;
+static char __pyx_k_value[] = "value";
+static PyObject *__pyx_kp_value;
+static char __pyx_k_context[] = "context";
+static PyObject *__pyx_kp_context;
+static char __pyx_k_dfas[] = "dfas";
+static PyObject *__pyx_kp_dfas;
+static char __pyx_k_labels[] = "labels";
+static PyObject *__pyx_kp_labels;
+static char __pyx_k_keywords[] = "keywords";
+static PyObject *__pyx_kp_keywords;
+static char __pyx_k_tokens[] = "tokens";
+static PyObject *__pyx_kp_tokens;
+static char __pyx_k_4[] = "number2symbol";
+static PyObject *__pyx_kp_4;
+static char __pyx_k_start[] = "start";
+static PyObject *__pyx_kp_start;
+static char __pyx_k_add[] = "add";
+static PyObject *__pyx_kp_add;
+static char __pyx_k_get[] = "get";
+static PyObject *__pyx_kp_get;
+static char __pyx_k_append[] = "append";
+static PyObject *__pyx_kp_append;
+static char __pyx_k_pop[] = "pop";
+static PyObject *__pyx_kp_pop;
+static char __pyx_k_used_names[] = "used_names";
+static PyObject *__pyx_kp_used_names;
+static PyObject *__pyx_kp_2;
+static PyObject *__pyx_builtin_Exception;
+static PyObject *__pyx_kp_3;
+static char __pyx_k_3[] = "%s: type=%r, value=%r, context=%r";
+static PyObject *__pyx_kp_5;
+static PyObject *__pyx_kp_6;
+static char __pyx_k_5[] = "too much input";
+static char __pyx_k_6[] = "bad input";
+static PyObject *__pyx_kp_7;
+static char __pyx_k_7[] = "bad token";
+
+/* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":22
+ *     """Exception to signal the parser is stuck."""
+ * 
+ *     def __init__(self, msg, type, value, context):             # <<<<<<<<<<<<<<
+ *         Exception.__init__(self, "%s: type=%r, value=%r, context=%r" %
+ *                            (msg, type, value, context))
+ */
+
+static PyObject *__pyx_pf_6sphinx_6pycode_5pgen2_5parse_10ParseError___init__(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyMethodDef __pyx_mdef_6sphinx_6pycode_5pgen2_5parse_10ParseError___init__ = {"__init__", (PyCFunction)__pyx_pf_6sphinx_6pycode_5pgen2_5parse_10ParseError___init__, METH_VARARGS|METH_KEYWORDS, 0};
+static PyObject *__pyx_pf_6sphinx_6pycode_5pgen2_5parse_10ParseError___init__(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_self = 0;
+  PyObject *__pyx_v_msg = 0;
+  PyObject *__pyx_v_type = 0;
+  PyObject *__pyx_v_value = 0;
+  PyObject *__pyx_v_context = 0;
+  PyObject *__pyx_r;
+  PyObject *__pyx_1 = 0;
+  PyObject *__pyx_2 = 0;
+  PyObject *__pyx_3 = 0;
+  static char *__pyx_argnames[] = {"self","msg","type","value","context",0};
+  __pyx_self = __pyx_self;
+  if (likely(!__pyx_kwds) && likely(PyTuple_GET_SIZE(__pyx_args) == 5)) {
+    __pyx_v_self = PyTuple_GET_ITEM(__pyx_args, 0);
+    __pyx_v_msg = PyTuple_GET_ITEM(__pyx_args, 1);
+    __pyx_v_type = PyTuple_GET_ITEM(__pyx_args, 2);
+    __pyx_v_value = PyTuple_GET_ITEM(__pyx_args, 3);
+    __pyx_v_context = PyTuple_GET_ITEM(__pyx_args, 4);
+  }
+  else {
+    if (unlikely(!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "OOOOO", __pyx_argnames, &__pyx_v_self, &__pyx_v_msg, &__pyx_v_type, &__pyx_v_value, &__pyx_v_context))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sphinx.pycode.pgen2.parse.ParseError.__init__");
+  return NULL;
+  __pyx_L4:;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":23
+ * 
+ *     def __init__(self, msg, type, value, context):
+ *         Exception.__init__(self, "%s: type=%r, value=%r, context=%r" %             # <<<<<<<<<<<<<<
+ *                            (msg, type, value, context))
+ *         self.msg = msg
+ */
+  __pyx_1 = PyObject_GetAttr(__pyx_builtin_Exception, __pyx_kp___init__); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":24
+ *     def __init__(self, msg, type, value, context):
+ *         Exception.__init__(self, "%s: type=%r, value=%r, context=%r" %
+ *                            (msg, type, value, context))             # <<<<<<<<<<<<<<
+ *         self.msg = msg
+ *         self.type = type
+ */
+  __pyx_2 = PyTuple_New(4); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_INCREF(__pyx_v_msg);
+  PyTuple_SET_ITEM(__pyx_2, 0, __pyx_v_msg);
+  Py_INCREF(__pyx_v_type);
+  PyTuple_SET_ITEM(__pyx_2, 1, __pyx_v_type);
+  Py_INCREF(__pyx_v_value);
+  PyTuple_SET_ITEM(__pyx_2, 2, __pyx_v_value);
+  Py_INCREF(__pyx_v_context);
+  PyTuple_SET_ITEM(__pyx_2, 3, __pyx_v_context);
+  __pyx_3 = PyNumber_Remainder(__pyx_kp_3, ((PyObject *)__pyx_2)); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_DECREF(((PyObject *)__pyx_2)); __pyx_2 = 0;
+  __pyx_2 = PyTuple_New(2); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_INCREF(__pyx_v_self);
+  PyTuple_SET_ITEM(__pyx_2, 0, __pyx_v_self);
+  PyTuple_SET_ITEM(__pyx_2, 1, __pyx_3);
+  __pyx_3 = 0;
+  __pyx_3 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_2), NULL); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+  Py_DECREF(((PyObject *)__pyx_2)); __pyx_2 = 0;
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":25
+ *         Exception.__init__(self, "%s: type=%r, value=%r, context=%r" %
+ *                            (msg, type, value, context))
+ *         self.msg = msg             # <<<<<<<<<<<<<<
+ *         self.type = type
+ *         self.value = value
+ */
+  if (PyObject_SetAttr(__pyx_v_self, __pyx_kp_msg, __pyx_v_msg) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":26
+ *                            (msg, type, value, context))
+ *         self.msg = msg
+ *         self.type = type             # <<<<<<<<<<<<<<
+ *         self.value = value
+ *         self.context = context
+ */
+  if (PyObject_SetAttr(__pyx_v_self, __pyx_kp_type, __pyx_v_type) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":27
+ *         self.msg = msg
+ *         self.type = type
+ *         self.value = value             # <<<<<<<<<<<<<<
+ *         self.context = context
+ * 
+ */
+  if (PyObject_SetAttr(__pyx_v_self, __pyx_kp_value, __pyx_v_value) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":28
+ *         self.type = type
+ *         self.value = value
+ *         self.context = context             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  if (PyObject_SetAttr(__pyx_v_self, __pyx_kp_context, __pyx_v_context) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  __pyx_r = Py_None; Py_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  Py_XDECREF(__pyx_1);
+  Py_XDECREF(__pyx_2);
+  Py_XDECREF(__pyx_3);
+  __Pyx_AddTraceback("sphinx.pycode.pgen2.parse.ParseError.__init__");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":36
+ *     cdef _grammar_number2symbol
+ * 
+ *     def __init__(self, grammar, convert=None):             # <<<<<<<<<<<<<<
+ *         self.grammar = grammar
+ *         #self.convert = convert or noconvert
+ */
+
+static int __pyx_pf_6sphinx_6pycode_5pgen2_5parse_6Parser___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_6sphinx_6pycode_5pgen2_5parse_6Parser___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_grammar = 0;
+  PyObject *__pyx_v_convert = 0;
+  int __pyx_r;
+  PyObject *__pyx_1 = 0;
+  static char *__pyx_argnames[] = {"grammar","convert",0};
+  __pyx_v_convert = Py_None;
+  if (likely(!__pyx_kwds) && likely(1 <= PyTuple_GET_SIZE(__pyx_args)) && likely(PyTuple_GET_SIZE(__pyx_args) <= 2)) {
+    __pyx_v_grammar = PyTuple_GET_ITEM(__pyx_args, 0);
+    if (PyTuple_GET_SIZE(__pyx_args) > 1) {
+      __pyx_v_convert = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+  }
+  else {
+    if (unlikely(!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "O|O", __pyx_argnames, &__pyx_v_grammar, &__pyx_v_convert))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sphinx.pycode.pgen2.parse.Parser.__init__");
+  return -1;
+  __pyx_L4:;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":37
+ * 
+ *     def __init__(self, grammar, convert=None):
+ *         self.grammar = grammar             # <<<<<<<<<<<<<<
+ *         #self.convert = convert or noconvert
+ * 
+ */
+  Py_INCREF(__pyx_v_grammar);
+  Py_DECREF(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->grammar);
+  ((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->grammar = __pyx_v_grammar;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":40
+ *         #self.convert = convert or noconvert
+ * 
+ *         self._grammar_dfas = grammar.dfas             # <<<<<<<<<<<<<<
+ *         self._grammar_labels = grammar.labels
+ *         self._grammar_keywords = grammar.keywords
+ */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_grammar, __pyx_kp_dfas); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_DECREF(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->_grammar_dfas);
+  ((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->_grammar_dfas = __pyx_1;
+  __pyx_1 = 0;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":41
+ * 
+ *         self._grammar_dfas = grammar.dfas
+ *         self._grammar_labels = grammar.labels             # <<<<<<<<<<<<<<
+ *         self._grammar_keywords = grammar.keywords
+ *         self._grammar_tokens = grammar.tokens
+ */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_grammar, __pyx_kp_labels); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_DECREF(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->_grammar_labels);
+  ((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->_grammar_labels = __pyx_1;
+  __pyx_1 = 0;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":42
+ *         self._grammar_dfas = grammar.dfas
+ *         self._grammar_labels = grammar.labels
+ *         self._grammar_keywords = grammar.keywords             # <<<<<<<<<<<<<<
+ *         self._grammar_tokens = grammar.tokens
+ *         self._grammar_number2symbol = grammar.number2symbol
+ */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_grammar, __pyx_kp_keywords); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_DECREF(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->_grammar_keywords);
+  ((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->_grammar_keywords = __pyx_1;
+  __pyx_1 = 0;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":43
+ *         self._grammar_labels = grammar.labels
+ *         self._grammar_keywords = grammar.keywords
+ *         self._grammar_tokens = grammar.tokens             # <<<<<<<<<<<<<<
+ *         self._grammar_number2symbol = grammar.number2symbol
+ * 
+ */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_grammar, __pyx_kp_tokens); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_DECREF(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->_grammar_tokens);
+  ((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->_grammar_tokens = __pyx_1;
+  __pyx_1 = 0;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":44
+ *         self._grammar_keywords = grammar.keywords
+ *         self._grammar_tokens = grammar.tokens
+ *         self._grammar_number2symbol = grammar.number2symbol             # <<<<<<<<<<<<<<
+ * 
+ *     def setup(self, start=None):
+ */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_grammar, __pyx_kp_4); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_DECREF(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->_grammar_number2symbol);
+  ((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->_grammar_number2symbol = __pyx_1;
+  __pyx_1 = 0;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  Py_XDECREF(__pyx_1);
+  __Pyx_AddTraceback("sphinx.pycode.pgen2.parse.Parser.__init__");
+  __pyx_r = -1;
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":46
+ *         self._grammar_number2symbol = grammar.number2symbol
+ * 
+ *     def setup(self, start=None):             # <<<<<<<<<<<<<<
+ *         if start is None:
+ *             start = self.grammar.start
+ */
+
+static PyObject *__pyx_pf_6sphinx_6pycode_5pgen2_5parse_6Parser_setup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_6sphinx_6pycode_5pgen2_5parse_6Parser_setup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_start = 0;
+  PyObject *__pyx_v_newnode;
+  PyObject *__pyx_v_stackentry;
+  PyObject *__pyx_r;
+  int __pyx_1;
+  PyObject *__pyx_2 = 0;
+  PyObject *__pyx_3 = 0;
+  static char *__pyx_argnames[] = {"start",0};
+  __pyx_v_start = Py_None;
+  if (likely(!__pyx_kwds) && likely(0 <= PyTuple_GET_SIZE(__pyx_args)) && likely(PyTuple_GET_SIZE(__pyx_args) <= 1)) {
+    if (PyTuple_GET_SIZE(__pyx_args) > 0) {
+      __pyx_v_start = PyTuple_GET_ITEM(__pyx_args, 0);
+    }
+  }
+  else {
+    if (unlikely(!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "|O", __pyx_argnames, &__pyx_v_start))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sphinx.pycode.pgen2.parse.Parser.setup");
+  return NULL;
+  __pyx_L4:;
+  Py_INCREF(__pyx_v_start);
+  __pyx_v_newnode = Py_None; Py_INCREF(Py_None);
+  __pyx_v_stackentry = Py_None; Py_INCREF(Py_None);
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":47
+ * 
+ *     def setup(self, start=None):
+ *         if start is None:             # <<<<<<<<<<<<<<
+ *             start = self.grammar.start
+ *         # Each stack entry is a tuple: (dfa, state, node).
+ */
+  __pyx_1 = (__pyx_v_start == Py_None);
+  if (__pyx_1) {
+
+    /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":48
+ *     def setup(self, start=None):
+ *         if start is None:
+ *             start = self.grammar.start             # <<<<<<<<<<<<<<
+ *         # Each stack entry is a tuple: (dfa, state, node).
+ *         # A node is a tuple: (type, value, context, children),
+ */
+    __pyx_2 = PyObject_GetAttr(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->grammar, __pyx_kp_start); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_v_start);
+    __pyx_v_start = __pyx_2;
+    __pyx_2 = 0;
+    goto __pyx_L5;
+  }
+  __pyx_L5:;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":52
+ *         # A node is a tuple: (type, value, context, children),
+ *         # where children is a list of nodes or None, and context may be None.
+ *         newnode = (start, None, None, [])             # <<<<<<<<<<<<<<
+ *         stackentry = (self._grammar_dfas[start], 0, newnode)
+ *         self.stack = [stackentry]
+ */
+  __pyx_2 = PyList_New(0); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_3 = PyTuple_New(4); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_INCREF(__pyx_v_start);
+  PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_start);
+  Py_INCREF(Py_None);
+  PyTuple_SET_ITEM(__pyx_3, 1, Py_None);
+  Py_INCREF(Py_None);
+  PyTuple_SET_ITEM(__pyx_3, 2, Py_None);
+  PyTuple_SET_ITEM(__pyx_3, 3, ((PyObject *)__pyx_2));
+  __pyx_2 = 0;
+  Py_DECREF(__pyx_v_newnode);
+  __pyx_v_newnode = ((PyObject *)__pyx_3);
+  __pyx_3 = 0;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":53
+ *         # where children is a list of nodes or None, and context may be None.
+ *         newnode = (start, None, None, [])
+ *         stackentry = (self._grammar_dfas[start], 0, newnode)             # <<<<<<<<<<<<<<
+ *         self.stack = [stackentry]
+ *         self.rootnode = None
+ */
+  __pyx_2 = PyObject_GetItem(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->_grammar_dfas, __pyx_v_start); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_3 = PyTuple_New(3); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyTuple_SET_ITEM(__pyx_3, 0, __pyx_2);
+  Py_INCREF(__pyx_int_0);
+  PyTuple_SET_ITEM(__pyx_3, 1, __pyx_int_0);
+  Py_INCREF(__pyx_v_newnode);
+  PyTuple_SET_ITEM(__pyx_3, 2, __pyx_v_newnode);
+  __pyx_2 = 0;
+  Py_DECREF(__pyx_v_stackentry);
+  __pyx_v_stackentry = ((PyObject *)__pyx_3);
+  __pyx_3 = 0;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":54
+ *         newnode = (start, None, None, [])
+ *         stackentry = (self._grammar_dfas[start], 0, newnode)
+ *         self.stack = [stackentry]             # <<<<<<<<<<<<<<
+ *         self.rootnode = None
+ *         self.used_names = set() # Aliased to self.rootnode.used_names in pop()
+ */
+  __pyx_2 = PyList_New(1); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_INCREF(__pyx_v_stackentry);
+  PyList_SET_ITEM(__pyx_2, 0, __pyx_v_stackentry);
+  Py_DECREF(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->stack);
+  ((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->stack = ((PyObject *)__pyx_2);
+  __pyx_2 = 0;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":55
+ *         stackentry = (self._grammar_dfas[start], 0, newnode)
+ *         self.stack = [stackentry]
+ *         self.rootnode = None             # <<<<<<<<<<<<<<
+ *         self.used_names = set() # Aliased to self.rootnode.used_names in pop()
+ * 
+ */
+  Py_INCREF(Py_None);
+  Py_DECREF(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->rootnode);
+  ((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->rootnode = Py_None;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":56
+ *         self.stack = [stackentry]
+ *         self.rootnode = None
+ *         self.used_names = set() # Aliased to self.rootnode.used_names in pop()             # <<<<<<<<<<<<<<
+ * 
+ *     def addtoken(self, type, value, context):
+ */
+  __pyx_3 = PyObject_Call(((PyObject*)&PySet_Type), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_DECREF(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->used_names);
+  ((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->used_names = __pyx_3;
+  __pyx_3 = 0;
+
+  __pyx_r = Py_None; Py_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  Py_XDECREF(__pyx_2);
+  Py_XDECREF(__pyx_3);
+  __Pyx_AddTraceback("sphinx.pycode.pgen2.parse.Parser.setup");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_newnode);
+  Py_DECREF(__pyx_v_stackentry);
+  Py_DECREF(__pyx_v_start);
+  return __pyx_r;
+}
+
+/* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":58
+ *         self.used_names = set() # Aliased to self.rootnode.used_names in pop()
+ * 
+ *     def addtoken(self, type, value, context):             # <<<<<<<<<<<<<<
+ *         """Add a token; return True iff this is the end of the program."""
+ *         cdef int ilabel, i, t, state, newstate
+ */
+
+static PyObject *__pyx_pf_6sphinx_6pycode_5pgen2_5parse_6Parser_addtoken(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_6sphinx_6pycode_5pgen2_5parse_6Parser_addtoken[] = "Add a token; return True iff this is the end of the program.";
+static PyObject *__pyx_pf_6sphinx_6pycode_5pgen2_5parse_6Parser_addtoken(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_type = 0;
+  PyObject *__pyx_v_value = 0;
+  PyObject *__pyx_v_context = 0;
+  int __pyx_v_ilabel;
+  int __pyx_v_i;
+  int __pyx_v_t;
+  int __pyx_v_state;
+  int __pyx_v_newstate;
+  PyObject *__pyx_v_dfa;
+  PyObject *__pyx_v_node;
+  PyObject *__pyx_v_states;
+  PyObject *__pyx_v_first;
+  PyObject *__pyx_v_arcs;
+  PyObject *__pyx_v_v;
+  PyObject *__pyx_v_itsdfa;
+  PyObject *__pyx_v_itsstates;
+  PyObject *__pyx_v_itsfirst;
+  PyObject *__pyx_r;
+  int __pyx_1;
+  PyObject *__pyx_2 = 0;
+  PyObject *__pyx_3 = 0;
+  PyObject *__pyx_4 = 0;
+  int __pyx_5;
+  Py_ssize_t __pyx_6 = 0;
+  PyObject *__pyx_7 = 0;
+  int __pyx_8;
+  static char *__pyx_argnames[] = {"type","value","context",0};
+  if (likely(!__pyx_kwds) && likely(PyTuple_GET_SIZE(__pyx_args) == 3)) {
+    __pyx_v_type = PyTuple_GET_ITEM(__pyx_args, 0);
+    __pyx_v_value = PyTuple_GET_ITEM(__pyx_args, 1);
+    __pyx_v_context = PyTuple_GET_ITEM(__pyx_args, 2);
+  }
+  else {
+    if (unlikely(!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "OOO", __pyx_argnames, &__pyx_v_type, &__pyx_v_value, &__pyx_v_context))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sphinx.pycode.pgen2.parse.Parser.addtoken");
+  return NULL;
+  __pyx_L4:;
+  __pyx_v_dfa = Py_None; Py_INCREF(Py_None);
+  __pyx_v_node = Py_None; Py_INCREF(Py_None);
+  __pyx_v_states = Py_None; Py_INCREF(Py_None);
+  __pyx_v_first = Py_None; Py_INCREF(Py_None);
+  __pyx_v_arcs = Py_None; Py_INCREF(Py_None);
+  __pyx_v_v = Py_None; Py_INCREF(Py_None);
+  __pyx_v_itsdfa = Py_None; Py_INCREF(Py_None);
+  __pyx_v_itsstates = Py_None; Py_INCREF(Py_None);
+  __pyx_v_itsfirst = Py_None; Py_INCREF(Py_None);
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":62
+ *         cdef int ilabel, i, t, state, newstate
+ *         # Map from token to label
+ *         ilabel = self.classify(type, value, context)             # <<<<<<<<<<<<<<
+ *         # Loop until the token is shifted; may raise exceptions
+ *         while True:
+ */
+  __pyx_v_ilabel = ((struct __pyx_vtabstruct_6sphinx_6pycode_5pgen2_5parse_Parser *)((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->__pyx_vtab)->classify(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self), __pyx_v_type, __pyx_v_value, __pyx_v_context);
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":64
+ *         ilabel = self.classify(type, value, context)
+ *         # Loop until the token is shifted; may raise exceptions
+ *         while True:             # <<<<<<<<<<<<<<
+ *             dfa, state, node = self.stack[-1]
+ *             states, first = dfa
+ */
+  while (1) {
+    __pyx_1 = 1;
+    if (!__pyx_1) break;
+
+    /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":65
+ *         # Loop until the token is shifted; may raise exceptions
+ *         while True:
+ *             dfa, state, node = self.stack[-1]             # <<<<<<<<<<<<<<
+ *             states, first = dfa
+ *             arcs = states[state]
+ */
+    __pyx_2 = __Pyx_GetItemInt(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->stack, -1, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyTuple_CheckExact(__pyx_2) && PyTuple_GET_SIZE(__pyx_2) == 3) {
+      PyObject* tuple = __pyx_2;
+      __pyx_4 = PyTuple_GET_ITEM(tuple, 0);
+      Py_INCREF(__pyx_4);
+      Py_DECREF(__pyx_v_dfa);
+      __pyx_v_dfa = __pyx_4;
+      __pyx_4 = 0;
+      __pyx_4 = PyTuple_GET_ITEM(tuple, 1);
+      Py_INCREF(__pyx_4);
+      __pyx_5 = __pyx_PyInt_int(__pyx_4); if (unlikely((__pyx_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      Py_DECREF(__pyx_4); __pyx_4 = 0;
+      __pyx_v_state = __pyx_5;
+      __pyx_4 = PyTuple_GET_ITEM(tuple, 2);
+      Py_INCREF(__pyx_4);
+      Py_DECREF(__pyx_v_node);
+      __pyx_v_node = __pyx_4;
+      __pyx_4 = 0;
+      Py_DECREF(__pyx_2); __pyx_2 = 0;
+    }
+    else {
+      __pyx_3 = PyObject_GetIter(__pyx_2); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      Py_DECREF(__pyx_2); __pyx_2 = 0;
+      __pyx_4 = __Pyx_UnpackItem(__pyx_3, 0); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      Py_DECREF(__pyx_v_dfa);
+      __pyx_v_dfa = __pyx_4;
+      __pyx_4 = 0;
+      __pyx_4 = __Pyx_UnpackItem(__pyx_3, 1); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_5 = __pyx_PyInt_int(__pyx_4); if (unlikely((__pyx_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      Py_DECREF(__pyx_4); __pyx_4 = 0;
+      __pyx_v_state = __pyx_5;
+      __pyx_4 = __Pyx_UnpackItem(__pyx_3, 2); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      Py_DECREF(__pyx_v_node);
+      __pyx_v_node = __pyx_4;
+      __pyx_4 = 0;
+      if (__Pyx_EndUnpack(__pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      Py_DECREF(__pyx_3); __pyx_3 = 0;
+    }
+
+    /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":66
+ *         while True:
+ *             dfa, state, node = self.stack[-1]
+ *             states, first = dfa             # <<<<<<<<<<<<<<
+ *             arcs = states[state]
+ *             # Look for a state with this label
+ */
+    if (PyTuple_CheckExact(__pyx_v_dfa) && PyTuple_GET_SIZE(__pyx_v_dfa) == 2) {
+      PyObject* tuple = __pyx_v_dfa;
+      __pyx_2 = PyTuple_GET_ITEM(tuple, 0);
+      Py_INCREF(__pyx_2);
+      Py_DECREF(__pyx_v_states);
+      __pyx_v_states = __pyx_2;
+      __pyx_2 = 0;
+      __pyx_3 = PyTuple_GET_ITEM(tuple, 1);
+      Py_INCREF(__pyx_3);
+      Py_DECREF(__pyx_v_first);
+      __pyx_v_first = __pyx_3;
+      __pyx_3 = 0;
+    }
+    else {
+      __pyx_4 = PyObject_GetIter(__pyx_v_dfa); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_2 = __Pyx_UnpackItem(__pyx_4, 0); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      Py_DECREF(__pyx_v_states);
+      __pyx_v_states = __pyx_2;
+      __pyx_2 = 0;
+      __pyx_3 = __Pyx_UnpackItem(__pyx_4, 1); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      Py_DECREF(__pyx_v_first);
+      __pyx_v_first = __pyx_3;
+      __pyx_3 = 0;
+      if (__Pyx_EndUnpack(__pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      Py_DECREF(__pyx_4); __pyx_4 = 0;
+    }
+
+    /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":67
+ *             dfa, state, node = self.stack[-1]
+ *             states, first = dfa
+ *             arcs = states[state]             # <<<<<<<<<<<<<<
+ *             # Look for a state with this label
+ *             for i, newstate in arcs:
+ */
+    __pyx_2 = __Pyx_GetItemInt(__pyx_v_states, __pyx_v_state, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_v_arcs);
+    __pyx_v_arcs = __pyx_2;
+    __pyx_2 = 0;
+
+    /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":69
+ *             arcs = states[state]
+ *             # Look for a state with this label
+ *             for i, newstate in arcs:             # <<<<<<<<<<<<<<
+ *                 t, v = self._grammar_labels[i]
+ *                 if ilabel == i:
+ */
+    if (PyList_CheckExact(__pyx_v_arcs) || PyTuple_CheckExact(__pyx_v_arcs)) {
+      __pyx_6 = 0; __pyx_3 = __pyx_v_arcs; Py_INCREF(__pyx_3);
+    } else {
+      __pyx_6 = -1; __pyx_3 = PyObject_GetIter(__pyx_v_arcs); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    for (;;) {
+      if (likely(PyList_CheckExact(__pyx_3))) {
+        if (__pyx_6 >= PyList_GET_SIZE(__pyx_3)) break;
+        __pyx_4 = PyList_GET_ITEM(__pyx_3, __pyx_6); Py_INCREF(__pyx_4); __pyx_6++;
+      } else if (likely(PyTuple_CheckExact(__pyx_3))) {
+        if (__pyx_6 >= PyTuple_GET_SIZE(__pyx_3)) break;
+        __pyx_4 = PyTuple_GET_ITEM(__pyx_3, __pyx_6); Py_INCREF(__pyx_4); __pyx_6++;
+      } else {
+        __pyx_4 = PyIter_Next(__pyx_3);
+        if (!__pyx_4) {
+          if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          break;
+        }
+      }
+      if (PyTuple_CheckExact(__pyx_4) && PyTuple_GET_SIZE(__pyx_4) == 2) {
+        PyObject* tuple = __pyx_4;
+        __pyx_7 = PyTuple_GET_ITEM(tuple, 0);
+        Py_INCREF(__pyx_7);
+        __pyx_5 = __pyx_PyInt_int(__pyx_7); if (unlikely((__pyx_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_DECREF(__pyx_7); __pyx_7 = 0;
+        __pyx_v_i = __pyx_5;
+        __pyx_7 = PyTuple_GET_ITEM(tuple, 1);
+        Py_INCREF(__pyx_7);
+        __pyx_5 = __pyx_PyInt_int(__pyx_7); if (unlikely((__pyx_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_DECREF(__pyx_7); __pyx_7 = 0;
+        __pyx_v_newstate = __pyx_5;
+        Py_DECREF(__pyx_4); __pyx_4 = 0;
+      }
+      else {
+        __pyx_2 = PyObject_GetIter(__pyx_4); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_DECREF(__pyx_4); __pyx_4 = 0;
+        __pyx_7 = __Pyx_UnpackItem(__pyx_2, 0); if (unlikely(!__pyx_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_5 = __pyx_PyInt_int(__pyx_7); if (unlikely((__pyx_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_DECREF(__pyx_7); __pyx_7 = 0;
+        __pyx_v_i = __pyx_5;
+        __pyx_7 = __Pyx_UnpackItem(__pyx_2, 1); if (unlikely(!__pyx_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_5 = __pyx_PyInt_int(__pyx_7); if (unlikely((__pyx_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_DECREF(__pyx_7); __pyx_7 = 0;
+        __pyx_v_newstate = __pyx_5;
+        if (__Pyx_EndUnpack(__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_DECREF(__pyx_2); __pyx_2 = 0;
+      }
+
+      /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":70
+ *             # Look for a state with this label
+ *             for i, newstate in arcs:
+ *                 t, v = self._grammar_labels[i]             # <<<<<<<<<<<<<<
+ *                 if ilabel == i:
+ *                     # Look it up in the list of labels
+ */
+      __pyx_7 = __Pyx_GetItemInt(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->_grammar_labels, __pyx_v_i, 0); if (!__pyx_7) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyTuple_CheckExact(__pyx_7) && PyTuple_GET_SIZE(__pyx_7) == 2) {
+        PyObject* tuple = __pyx_7;
+        __pyx_2 = PyTuple_GET_ITEM(tuple, 0);
+        Py_INCREF(__pyx_2);
+        __pyx_5 = __pyx_PyInt_int(__pyx_2); if (unlikely((__pyx_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_DECREF(__pyx_2); __pyx_2 = 0;
+        __pyx_v_t = __pyx_5;
+        __pyx_2 = PyTuple_GET_ITEM(tuple, 1);
+        Py_INCREF(__pyx_2);
+        Py_DECREF(__pyx_v_v);
+        __pyx_v_v = __pyx_2;
+        __pyx_2 = 0;
+        Py_DECREF(__pyx_7); __pyx_7 = 0;
+      }
+      else {
+        __pyx_4 = PyObject_GetIter(__pyx_7); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_DECREF(__pyx_7); __pyx_7 = 0;
+        __pyx_2 = __Pyx_UnpackItem(__pyx_4, 0); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_5 = __pyx_PyInt_int(__pyx_2); if (unlikely((__pyx_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_DECREF(__pyx_2); __pyx_2 = 0;
+        __pyx_v_t = __pyx_5;
+        __pyx_2 = __Pyx_UnpackItem(__pyx_4, 1); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_DECREF(__pyx_v_v);
+        __pyx_v_v = __pyx_2;
+        __pyx_2 = 0;
+        if (__Pyx_EndUnpack(__pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_DECREF(__pyx_4); __pyx_4 = 0;
+      }
+
+      /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":71
+ *             for i, newstate in arcs:
+ *                 t, v = self._grammar_labels[i]
+ *                 if ilabel == i:             # <<<<<<<<<<<<<<
+ *                     # Look it up in the list of labels
+ *                     ## assert t < 256
+ */
+      __pyx_1 = (__pyx_v_ilabel == __pyx_v_i);
+      if (__pyx_1) {
+
+        /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":75
+ *                     ## assert t < 256
+ *                     # Shift a token; we're done with it
+ *                     self.shift(type, value, newstate, context)             # <<<<<<<<<<<<<<
+ *                     # Pop while we are in an accept-only state
+ *                     state = newstate
+ */
+        __pyx_2 = PyInt_FromLong(__pyx_v_newstate); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        ((struct __pyx_vtabstruct_6sphinx_6pycode_5pgen2_5parse_Parser *)((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->__pyx_vtab)->shift(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self), __pyx_v_type, __pyx_v_value, __pyx_2, __pyx_v_context);
+        Py_DECREF(__pyx_2); __pyx_2 = 0;
+
+        /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":77
+ *                     self.shift(type, value, newstate, context)
+ *                     # Pop while we are in an accept-only state
+ *                     state = newstate             # <<<<<<<<<<<<<<
+ *                     while states[state] == [(0, state)]:
+ *                         self.pop()
+ */
+        __pyx_v_state = __pyx_v_newstate;
+
+        /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":78
+ *                     # Pop while we are in an accept-only state
+ *                     state = newstate
+ *                     while states[state] == [(0, state)]:             # <<<<<<<<<<<<<<
+ *                         self.pop()
+ *                         if not self.stack:
+ */
+        while (1) {
+          __pyx_7 = __Pyx_GetItemInt(__pyx_v_states, __pyx_v_state, 0); if (!__pyx_7) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_4 = PyInt_FromLong(__pyx_v_state); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_2 = PyTuple_New(2); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          Py_INCREF(__pyx_int_0);
+          PyTuple_SET_ITEM(__pyx_2, 0, __pyx_int_0);
+          PyTuple_SET_ITEM(__pyx_2, 1, __pyx_4);
+          __pyx_4 = 0;
+          __pyx_4 = PyList_New(1); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          PyList_SET_ITEM(__pyx_4, 0, ((PyObject *)__pyx_2));
+          __pyx_2 = 0;
+          __pyx_2 = PyObject_RichCompare(__pyx_7, ((PyObject *)__pyx_4), Py_EQ); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          Py_DECREF(__pyx_7); __pyx_7 = 0;
+          Py_DECREF(((PyObject *)__pyx_4)); __pyx_4 = 0;
+          __pyx_1 = __Pyx_PyObject_IsTrue(__pyx_2); if (unlikely(__pyx_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          Py_DECREF(__pyx_2); __pyx_2 = 0;
+          if (!__pyx_1) break;
+
+          /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":79
+ *                     state = newstate
+ *                     while states[state] == [(0, state)]:
+ *                         self.pop()             # <<<<<<<<<<<<<<
+ *                         if not self.stack:
+ *                             # Done parsing!
+ */
+          ((struct __pyx_vtabstruct_6sphinx_6pycode_5pgen2_5parse_Parser *)((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->__pyx_vtab)->pop(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self));
+
+          /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":80
+ *                     while states[state] == [(0, state)]:
+ *                         self.pop()
+ *                         if not self.stack:             # <<<<<<<<<<<<<<
+ *                             # Done parsing!
+ *                             return True
+ */
+          __pyx_1 = __Pyx_PyObject_IsTrue(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->stack); if (unlikely(__pyx_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_8 = (!__pyx_1);
+          if (__pyx_8) {
+
+            /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":82
+ *                         if not self.stack:
+ *                             # Done parsing!
+ *                             return True             # <<<<<<<<<<<<<<
+ *                         dfa, state, node = self.stack[-1]
+ *                         states, first = dfa
+ */
+            __pyx_7 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_r = __pyx_7;
+            __pyx_7 = 0;
+            Py_DECREF(__pyx_3); __pyx_3 = 0;
+            goto __pyx_L0;
+            goto __pyx_L12;
+          }
+          __pyx_L12:;
+
+          /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":83
+ *                             # Done parsing!
+ *                             return True
+ *                         dfa, state, node = self.stack[-1]             # <<<<<<<<<<<<<<
+ *                         states, first = dfa
+ *                     # Done with this token
+ */
+          __pyx_4 = __Pyx_GetItemInt(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->stack, -1, 0); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyTuple_CheckExact(__pyx_4) && PyTuple_GET_SIZE(__pyx_4) == 3) {
+            PyObject* tuple = __pyx_4;
+            __pyx_7 = PyTuple_GET_ITEM(tuple, 0);
+            Py_INCREF(__pyx_7);
+            Py_DECREF(__pyx_v_dfa);
+            __pyx_v_dfa = __pyx_7;
+            __pyx_7 = 0;
+            __pyx_7 = PyTuple_GET_ITEM(tuple, 1);
+            Py_INCREF(__pyx_7);
+            __pyx_5 = __pyx_PyInt_int(__pyx_7); if (unlikely((__pyx_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            Py_DECREF(__pyx_7); __pyx_7 = 0;
+            __pyx_v_state = __pyx_5;
+            __pyx_7 = PyTuple_GET_ITEM(tuple, 2);
+            Py_INCREF(__pyx_7);
+            Py_DECREF(__pyx_v_node);
+            __pyx_v_node = __pyx_7;
+            __pyx_7 = 0;
+            Py_DECREF(__pyx_4); __pyx_4 = 0;
+          }
+          else {
+            __pyx_2 = PyObject_GetIter(__pyx_4); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            Py_DECREF(__pyx_4); __pyx_4 = 0;
+            __pyx_7 = __Pyx_UnpackItem(__pyx_2, 0); if (unlikely(!__pyx_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            Py_DECREF(__pyx_v_dfa);
+            __pyx_v_dfa = __pyx_7;
+            __pyx_7 = 0;
+            __pyx_7 = __Pyx_UnpackItem(__pyx_2, 1); if (unlikely(!__pyx_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_5 = __pyx_PyInt_int(__pyx_7); if (unlikely((__pyx_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            Py_DECREF(__pyx_7); __pyx_7 = 0;
+            __pyx_v_state = __pyx_5;
+            __pyx_7 = __Pyx_UnpackItem(__pyx_2, 2); if (unlikely(!__pyx_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            Py_DECREF(__pyx_v_node);
+            __pyx_v_node = __pyx_7;
+            __pyx_7 = 0;
+            if (__Pyx_EndUnpack(__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            Py_DECREF(__pyx_2); __pyx_2 = 0;
+          }
+
+          /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":84
+ *                             return True
+ *                         dfa, state, node = self.stack[-1]
+ *                         states, first = dfa             # <<<<<<<<<<<<<<
+ *                     # Done with this token
+ *                     return False
+ */
+          if (PyTuple_CheckExact(__pyx_v_dfa) && PyTuple_GET_SIZE(__pyx_v_dfa) == 2) {
+            PyObject* tuple = __pyx_v_dfa;
+            __pyx_4 = PyTuple_GET_ITEM(tuple, 0);
+            Py_INCREF(__pyx_4);
+            Py_DECREF(__pyx_v_states);
+            __pyx_v_states = __pyx_4;
+            __pyx_4 = 0;
+            __pyx_2 = PyTuple_GET_ITEM(tuple, 1);
+            Py_INCREF(__pyx_2);
+            Py_DECREF(__pyx_v_first);
+            __pyx_v_first = __pyx_2;
+            __pyx_2 = 0;
+          }
+          else {
+            __pyx_7 = PyObject_GetIter(__pyx_v_dfa); if (unlikely(!__pyx_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_4 = __Pyx_UnpackItem(__pyx_7, 0); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            Py_DECREF(__pyx_v_states);
+            __pyx_v_states = __pyx_4;
+            __pyx_4 = 0;
+            __pyx_2 = __Pyx_UnpackItem(__pyx_7, 1); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            Py_DECREF(__pyx_v_first);
+            __pyx_v_first = __pyx_2;
+            __pyx_2 = 0;
+            if (__Pyx_EndUnpack(__pyx_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            Py_DECREF(__pyx_7); __pyx_7 = 0;
+          }
+        }
+
+        /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":86
+ *                         states, first = dfa
+ *                     # Done with this token
+ *                     return False             # <<<<<<<<<<<<<<
+ *                 elif t >= 256:
+ *                     # See if it's a symbol and if we're in its first set
+ */
+        __pyx_4 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_r = __pyx_4;
+        __pyx_4 = 0;
+        Py_DECREF(__pyx_3); __pyx_3 = 0;
+        goto __pyx_L0;
+        goto __pyx_L9;
+      }
+
+      /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":87
+ *                     # Done with this token
+ *                     return False
+ *                 elif t >= 256:             # <<<<<<<<<<<<<<
+ *                     # See if it's a symbol and if we're in its first set
+ *                     itsdfa = self._grammar_dfas[t]
+ */
+      __pyx_1 = (__pyx_v_t >= 256);
+      if (__pyx_1) {
+
+        /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":89
+ *                 elif t >= 256:
+ *                     # See if it's a symbol and if we're in its first set
+ *                     itsdfa = self._grammar_dfas[t]             # <<<<<<<<<<<<<<
+ *                     itsstates, itsfirst = itsdfa
+ *                     if ilabel in itsfirst:
+ */
+        __pyx_2 = __Pyx_GetItemInt(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->_grammar_dfas, __pyx_v_t, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_DECREF(__pyx_v_itsdfa);
+        __pyx_v_itsdfa = __pyx_2;
+        __pyx_2 = 0;
+
+        /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":90
+ *                     # See if it's a symbol and if we're in its first set
+ *                     itsdfa = self._grammar_dfas[t]
+ *                     itsstates, itsfirst = itsdfa             # <<<<<<<<<<<<<<
+ *                     if ilabel in itsfirst:
+ *                         # Push a symbol
+ */
+        if (PyTuple_CheckExact(__pyx_v_itsdfa) && PyTuple_GET_SIZE(__pyx_v_itsdfa) == 2) {
+          PyObject* tuple = __pyx_v_itsdfa;
+          __pyx_4 = PyTuple_GET_ITEM(tuple, 0);
+          Py_INCREF(__pyx_4);
+          Py_DECREF(__pyx_v_itsstates);
+          __pyx_v_itsstates = __pyx_4;
+          __pyx_4 = 0;
+          __pyx_2 = PyTuple_GET_ITEM(tuple, 1);
+          Py_INCREF(__pyx_2);
+          Py_DECREF(__pyx_v_itsfirst);
+          __pyx_v_itsfirst = __pyx_2;
+          __pyx_2 = 0;
+        }
+        else {
+          __pyx_7 = PyObject_GetIter(__pyx_v_itsdfa); if (unlikely(!__pyx_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_4 = __Pyx_UnpackItem(__pyx_7, 0); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          Py_DECREF(__pyx_v_itsstates);
+          __pyx_v_itsstates = __pyx_4;
+          __pyx_4 = 0;
+          __pyx_2 = __Pyx_UnpackItem(__pyx_7, 1); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          Py_DECREF(__pyx_v_itsfirst);
+          __pyx_v_itsfirst = __pyx_2;
+          __pyx_2 = 0;
+          if (__Pyx_EndUnpack(__pyx_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          Py_DECREF(__pyx_7); __pyx_7 = 0;
+        }
+
+        /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":91
+ *                     itsdfa = self._grammar_dfas[t]
+ *                     itsstates, itsfirst = itsdfa
+ *                     if ilabel in itsfirst:             # <<<<<<<<<<<<<<
+ *                         # Push a symbol
+ *                         self.push(t, itsdfa, newstate, context)
+ */
+        __pyx_4 = PyInt_FromLong(__pyx_v_ilabel); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_8 = (PySequence_Contains(__pyx_v_itsfirst, __pyx_4)); if (unlikely(__pyx_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_DECREF(__pyx_4); __pyx_4 = 0;
+        if (__pyx_8) {
+
+          /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":93
+ *                     if ilabel in itsfirst:
+ *                         # Push a symbol
+ *                         self.push(t, itsdfa, newstate, context)             # <<<<<<<<<<<<<<
+ *                         break # To continue the outer while loop
+ *             else:
+ */
+          __pyx_2 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_7 = PyInt_FromLong(__pyx_v_newstate); if (unlikely(!__pyx_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          ((struct __pyx_vtabstruct_6sphinx_6pycode_5pgen2_5parse_Parser *)((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->__pyx_vtab)->push(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self), __pyx_2, __pyx_v_itsdfa, __pyx_7, __pyx_v_context);
+          Py_DECREF(__pyx_2); __pyx_2 = 0;
+          Py_DECREF(__pyx_7); __pyx_7 = 0;
+
+          /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":94
+ *                         # Push a symbol
+ *                         self.push(t, itsdfa, newstate, context)
+ *                         break # To continue the outer while loop             # <<<<<<<<<<<<<<
+ *             else:
+ *                 if (0, state) in arcs:
+ */
+          goto __pyx_L8;
+          goto __pyx_L13;
+        }
+        __pyx_L13:;
+        goto __pyx_L9;
+      }
+      __pyx_L9:;
+    }
+    /*else*/ {
+
+      /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":96
+ *                         break # To continue the outer while loop
+ *             else:
+ *                 if (0, state) in arcs:             # <<<<<<<<<<<<<<
+ *                     # An accepting state, pop it and try something else
+ *                     self.pop()
+ */
+      __pyx_4 = PyInt_FromLong(__pyx_v_state); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_2 = PyTuple_New(2); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      Py_INCREF(__pyx_int_0);
+      PyTuple_SET_ITEM(__pyx_2, 0, __pyx_int_0);
+      PyTuple_SET_ITEM(__pyx_2, 1, __pyx_4);
+      __pyx_4 = 0;
+      __pyx_1 = (PySequence_Contains(__pyx_v_arcs, ((PyObject *)__pyx_2))); if (unlikely(__pyx_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      Py_DECREF(((PyObject *)__pyx_2)); __pyx_2 = 0;
+      if (__pyx_1) {
+
+        /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":98
+ *                 if (0, state) in arcs:
+ *                     # An accepting state, pop it and try something else
+ *                     self.pop()             # <<<<<<<<<<<<<<
+ *                     if not self.stack:
+ *                         # Done parsing, but another token is input
+ */
+        ((struct __pyx_vtabstruct_6sphinx_6pycode_5pgen2_5parse_Parser *)((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->__pyx_vtab)->pop(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self));
+
+        /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":99
+ *                     # An accepting state, pop it and try something else
+ *                     self.pop()
+ *                     if not self.stack:             # <<<<<<<<<<<<<<
+ *                         # Done parsing, but another token is input
+ *                         raise ParseError("too much input",
+ */
+        __pyx_8 = __Pyx_PyObject_IsTrue(((struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self)->stack); if (unlikely(__pyx_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_1 = (!__pyx_8);
+        if (__pyx_1) {
+
+          /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":101
+ *                     if not self.stack:
+ *                         # Done parsing, but another token is input
+ *                         raise ParseError("too much input",             # <<<<<<<<<<<<<<
+ *                                          type, value, context)
+ *                 else:
+ */
+          __pyx_7 = __Pyx_GetName(__pyx_m, __pyx_kp_ParseError); if (unlikely(!__pyx_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+          /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":102
+ *                         # Done parsing, but another token is input
+ *                         raise ParseError("too much input",
+ *                                          type, value, context)             # <<<<<<<<<<<<<<
+ *                 else:
+ *                     # No success finding a transition
+ */
+          __pyx_4 = PyTuple_New(4); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          Py_INCREF(__pyx_kp_5);
+          PyTuple_SET_ITEM(__pyx_4, 0, __pyx_kp_5);
+          Py_INCREF(__pyx_v_type);
+          PyTuple_SET_ITEM(__pyx_4, 1, __pyx_v_type);
+          Py_INCREF(__pyx_v_value);
+          PyTuple_SET_ITEM(__pyx_4, 2, __pyx_v_value);
+          Py_INCREF(__pyx_v_context);
+          PyTuple_SET_ITEM(__pyx_4, 3, __pyx_v_context);
+          __pyx_2 = PyObject_Call(__pyx_7, ((PyObject *)__pyx_4), NULL); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          Py_DECREF(__pyx_7); __pyx_7 = 0;
+          Py_DECREF(((PyObject *)__pyx_4)); __pyx_4 = 0;
+          __Pyx_Raise(__pyx_2, 0, 0);
+          Py_DECREF(__pyx_2); __pyx_2 = 0;
+          {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          goto __pyx_L15;
+        }
+        __pyx_L15:;
+        goto __pyx_L14;
+      }
+      /*else*/ {
+
+        /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":105
+ *                 else:
+ *                     # No success finding a transition
+ *                     raise ParseError("bad input", type, value, context)             # <<<<<<<<<<<<<<
+ * 
+ *     cdef int classify(self, type, value, context):
+ */
+        __pyx_7 = __Pyx_GetName(__pyx_m, __pyx_kp_ParseError); if (unlikely(!__pyx_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_4 = PyTuple_New(4); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_INCREF(__pyx_kp_6);
+        PyTuple_SET_ITEM(__pyx_4, 0, __pyx_kp_6);
+        Py_INCREF(__pyx_v_type);
+        PyTuple_SET_ITEM(__pyx_4, 1, __pyx_v_type);
+        Py_INCREF(__pyx_v_value);
+        PyTuple_SET_ITEM(__pyx_4, 2, __pyx_v_value);
+        Py_INCREF(__pyx_v_context);
+        PyTuple_SET_ITEM(__pyx_4, 3, __pyx_v_context);
+        __pyx_2 = PyObject_Call(__pyx_7, ((PyObject *)__pyx_4), NULL); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        Py_DECREF(__pyx_7); __pyx_7 = 0;
+        Py_DECREF(((PyObject *)__pyx_4)); __pyx_4 = 0;
+        __Pyx_Raise(__pyx_2, 0, 0);
+        Py_DECREF(__pyx_2); __pyx_2 = 0;
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __pyx_L14:;
+    }
+    __pyx_L8:;
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
+  }
+
+  __pyx_r = Py_None; Py_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  Py_XDECREF(__pyx_2);
+  Py_XDECREF(__pyx_3);
+  Py_XDECREF(__pyx_4);
+  Py_XDECREF(__pyx_7);
+  __Pyx_AddTraceback("sphinx.pycode.pgen2.parse.Parser.addtoken");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_dfa);
+  Py_DECREF(__pyx_v_node);
+  Py_DECREF(__pyx_v_states);
+  Py_DECREF(__pyx_v_first);
+  Py_DECREF(__pyx_v_arcs);
+  Py_DECREF(__pyx_v_v);
+  Py_DECREF(__pyx_v_itsdfa);
+  Py_DECREF(__pyx_v_itsstates);
+  Py_DECREF(__pyx_v_itsfirst);
+  return __pyx_r;
+}
+
+/* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":107
+ *                     raise ParseError("bad input", type, value, context)
+ * 
+ *     cdef int classify(self, type, value, context):             # <<<<<<<<<<<<<<
+ *         """Turn a token into a label.  (Internal)"""
+ *         if type == NAME:
+ */
+
+static  int __pyx_f_6sphinx_6pycode_5pgen2_5parse_6Parser_classify(struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *__pyx_v_self, PyObject *__pyx_v_type, PyObject *__pyx_v_value, PyObject *__pyx_v_context) {
+  PyObject *__pyx_v_ilabel;
+  int __pyx_r;
+  PyObject *__pyx_1 = 0;
+  int __pyx_2;
+  PyObject *__pyx_3 = 0;
+  PyObject *__pyx_4 = 0;
+  int __pyx_5;
+  __pyx_v_ilabel = Py_None; Py_INCREF(Py_None);
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":109
+ *     cdef int classify(self, type, value, context):
+ *         """Turn a token into a label.  (Internal)"""
+ *         if type == NAME:             # <<<<<<<<<<<<<<
+ *             # Keep a listing of all used names
+ *             self.used_names.add(value)
+ */
+  __pyx_1 = PyObject_RichCompare(__pyx_v_type, __pyx_int_1, Py_EQ); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_2 = __Pyx_PyObject_IsTrue(__pyx_1); if (unlikely(__pyx_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+  if (__pyx_2) {
+
+    /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":111
+ *         if type == NAME:
+ *             # Keep a listing of all used names
+ *             self.used_names.add(value)             # <<<<<<<<<<<<<<
+ *             # Check for reserved words
+ *             ilabel = self._grammar_keywords.get(value)
+ */
+    __pyx_1 = PyObject_GetAttr(__pyx_v_self->used_names, __pyx_kp_add); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_3 = PyTuple_New(1); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_INCREF(__pyx_v_value);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_value);
+    __pyx_4 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_3), NULL); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_1); __pyx_1 = 0;
+    Py_DECREF(((PyObject *)__pyx_3)); __pyx_3 = 0;
+    Py_DECREF(__pyx_4); __pyx_4 = 0;
+
+    /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":113
+ *             self.used_names.add(value)
+ *             # Check for reserved words
+ *             ilabel = self._grammar_keywords.get(value)             # <<<<<<<<<<<<<<
+ *             if ilabel is not None:
+ *                 return ilabel
+ */
+    __pyx_1 = PyObject_GetAttr(__pyx_v_self->_grammar_keywords, __pyx_kp_get); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_3 = PyTuple_New(1); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_INCREF(__pyx_v_value);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_value);
+    __pyx_4 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_3), NULL); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_1); __pyx_1 = 0;
+    Py_DECREF(((PyObject *)__pyx_3)); __pyx_3 = 0;
+    Py_DECREF(__pyx_v_ilabel);
+    __pyx_v_ilabel = __pyx_4;
+    __pyx_4 = 0;
+
+    /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":114
+ *             # Check for reserved words
+ *             ilabel = self._grammar_keywords.get(value)
+ *             if ilabel is not None:             # <<<<<<<<<<<<<<
+ *                 return ilabel
+ *         ilabel = self._grammar_tokens.get(type)
+ */
+    __pyx_2 = (__pyx_v_ilabel != Py_None);
+    if (__pyx_2) {
+
+      /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":115
+ *             ilabel = self._grammar_keywords.get(value)
+ *             if ilabel is not None:
+ *                 return ilabel             # <<<<<<<<<<<<<<
+ *         ilabel = self._grammar_tokens.get(type)
+ *         if ilabel is None:
+ */
+      __pyx_5 = __pyx_PyInt_int(__pyx_v_ilabel); if (unlikely((__pyx_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_r = __pyx_5;
+      goto __pyx_L0;
+      goto __pyx_L4;
+    }
+    __pyx_L4:;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":116
+ *             if ilabel is not None:
+ *                 return ilabel
+ *         ilabel = self._grammar_tokens.get(type)             # <<<<<<<<<<<<<<
+ *         if ilabel is None:
+ *             raise ParseError("bad token", type, value, context)
+ */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self->_grammar_tokens, __pyx_kp_get); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_3 = PyTuple_New(1); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_INCREF(__pyx_v_type);
+  PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_type);
+  __pyx_4 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_3), NULL); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+  Py_DECREF(((PyObject *)__pyx_3)); __pyx_3 = 0;
+  Py_DECREF(__pyx_v_ilabel);
+  __pyx_v_ilabel = __pyx_4;
+  __pyx_4 = 0;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":117
+ *                 return ilabel
+ *         ilabel = self._grammar_tokens.get(type)
+ *         if ilabel is None:             # <<<<<<<<<<<<<<
+ *             raise ParseError("bad token", type, value, context)
+ *         return ilabel
+ */
+  __pyx_2 = (__pyx_v_ilabel == Py_None);
+  if (__pyx_2) {
+
+    /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":118
+ *         ilabel = self._grammar_tokens.get(type)
+ *         if ilabel is None:
+ *             raise ParseError("bad token", type, value, context)             # <<<<<<<<<<<<<<
+ *         return ilabel
+ * 
+ */
+    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_ParseError); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_3 = PyTuple_New(4); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_INCREF(__pyx_kp_7);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_kp_7);
+    Py_INCREF(__pyx_v_type);
+    PyTuple_SET_ITEM(__pyx_3, 1, __pyx_v_type);
+    Py_INCREF(__pyx_v_value);
+    PyTuple_SET_ITEM(__pyx_3, 2, __pyx_v_value);
+    Py_INCREF(__pyx_v_context);
+    PyTuple_SET_ITEM(__pyx_3, 3, __pyx_v_context);
+    __pyx_4 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_3), NULL); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_1); __pyx_1 = 0;
+    Py_DECREF(((PyObject *)__pyx_3)); __pyx_3 = 0;
+    __Pyx_Raise(__pyx_4, 0, 0);
+    Py_DECREF(__pyx_4); __pyx_4 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L5;
+  }
+  __pyx_L5:;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":119
+ *         if ilabel is None:
+ *             raise ParseError("bad token", type, value, context)
+ *         return ilabel             # <<<<<<<<<<<<<<
+ * 
+ *     cdef void shift(self, type, value, newstate, context):
+ */
+  __pyx_5 = __pyx_PyInt_int(__pyx_v_ilabel); if (unlikely((__pyx_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_5;
+  goto __pyx_L0;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  Py_XDECREF(__pyx_1);
+  Py_XDECREF(__pyx_3);
+  Py_XDECREF(__pyx_4);
+  __Pyx_WriteUnraisable("sphinx.pycode.pgen2.parse.Parser.classify");
+  __pyx_r = 0;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_ilabel);
+  return __pyx_r;
+}
+
+/* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":121
+ *         return ilabel
+ * 
+ *     cdef void shift(self, type, value, newstate, context):             # <<<<<<<<<<<<<<
+ *         """Shift a token.  (Internal)"""
+ *         dfa, state, node = self.stack[-1]
+ */
+
+static  void __pyx_f_6sphinx_6pycode_5pgen2_5parse_6Parser_shift(struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *__pyx_v_self, PyObject *__pyx_v_type, PyObject *__pyx_v_value, PyObject *__pyx_v_newstate, PyObject *__pyx_v_context) {
+  PyObject *__pyx_v_dfa;
+  PyObject *__pyx_v_state;
+  PyObject *__pyx_v_node;
+  PyObject *__pyx_v_newnode;
+  PyObject *__pyx_1 = 0;
+  PyObject *__pyx_2 = 0;
+  PyObject *__pyx_3 = 0;
+  int __pyx_4;
+  __pyx_v_dfa = Py_None; Py_INCREF(Py_None);
+  __pyx_v_state = Py_None; Py_INCREF(Py_None);
+  __pyx_v_node = Py_None; Py_INCREF(Py_None);
+  __pyx_v_newnode = Py_None; Py_INCREF(Py_None);
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":123
+ *     cdef void shift(self, type, value, newstate, context):
+ *         """Shift a token.  (Internal)"""
+ *         dfa, state, node = self.stack[-1]             # <<<<<<<<<<<<<<
+ *         newnode = (type, value, context, None)
+ *         newnode = self.convert(newnode)
+ */
+  __pyx_1 = __Pyx_GetItemInt(__pyx_v_self->stack, -1, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyTuple_CheckExact(__pyx_1) && PyTuple_GET_SIZE(__pyx_1) == 3) {
+    PyObject* tuple = __pyx_1;
+    __pyx_3 = PyTuple_GET_ITEM(tuple, 0);
+    Py_INCREF(__pyx_3);
+    Py_DECREF(__pyx_v_dfa);
+    __pyx_v_dfa = __pyx_3;
+    __pyx_3 = 0;
+    __pyx_3 = PyTuple_GET_ITEM(tuple, 1);
+    Py_INCREF(__pyx_3);
+    Py_DECREF(__pyx_v_state);
+    __pyx_v_state = __pyx_3;
+    __pyx_3 = 0;
+    __pyx_3 = PyTuple_GET_ITEM(tuple, 2);
+    Py_INCREF(__pyx_3);
+    Py_DECREF(__pyx_v_node);
+    __pyx_v_node = __pyx_3;
+    __pyx_3 = 0;
+    Py_DECREF(__pyx_1); __pyx_1 = 0;
+  }
+  else {
+    __pyx_2 = PyObject_GetIter(__pyx_1); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_1); __pyx_1 = 0;
+    __pyx_3 = __Pyx_UnpackItem(__pyx_2, 0); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_v_dfa);
+    __pyx_v_dfa = __pyx_3;
+    __pyx_3 = 0;
+    __pyx_3 = __Pyx_UnpackItem(__pyx_2, 1); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_v_state);
+    __pyx_v_state = __pyx_3;
+    __pyx_3 = 0;
+    __pyx_3 = __Pyx_UnpackItem(__pyx_2, 2); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_v_node);
+    __pyx_v_node = __pyx_3;
+    __pyx_3 = 0;
+    if (__Pyx_EndUnpack(__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_2); __pyx_2 = 0;
+  }
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":124
+ *         """Shift a token.  (Internal)"""
+ *         dfa, state, node = self.stack[-1]
+ *         newnode = (type, value, context, None)             # <<<<<<<<<<<<<<
+ *         newnode = self.convert(newnode)
+ *         if newnode is not None:
+ */
+  __pyx_3 = PyTuple_New(4); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_INCREF(__pyx_v_type);
+  PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_type);
+  Py_INCREF(__pyx_v_value);
+  PyTuple_SET_ITEM(__pyx_3, 1, __pyx_v_value);
+  Py_INCREF(__pyx_v_context);
+  PyTuple_SET_ITEM(__pyx_3, 2, __pyx_v_context);
+  Py_INCREF(Py_None);
+  PyTuple_SET_ITEM(__pyx_3, 3, Py_None);
+  Py_DECREF(__pyx_v_newnode);
+  __pyx_v_newnode = ((PyObject *)__pyx_3);
+  __pyx_3 = 0;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":125
+ *         dfa, state, node = self.stack[-1]
+ *         newnode = (type, value, context, None)
+ *         newnode = self.convert(newnode)             # <<<<<<<<<<<<<<
+ *         if newnode is not None:
+ *             node[-1].append(newnode)
+ */
+  __pyx_1 = ((struct __pyx_vtabstruct_6sphinx_6pycode_5pgen2_5parse_Parser *)__pyx_v_self->__pyx_vtab)->convert(__pyx_v_self, __pyx_v_newnode); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_DECREF(__pyx_v_newnode);
+  __pyx_v_newnode = __pyx_1;
+  __pyx_1 = 0;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":126
+ *         newnode = (type, value, context, None)
+ *         newnode = self.convert(newnode)
+ *         if newnode is not None:             # <<<<<<<<<<<<<<
+ *             node[-1].append(newnode)
+ *         self.stack[-1] = (dfa, newstate, node)
+ */
+  __pyx_4 = (__pyx_v_newnode != Py_None);
+  if (__pyx_4) {
+
+    /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":127
+ *         newnode = self.convert(newnode)
+ *         if newnode is not None:
+ *             node[-1].append(newnode)             # <<<<<<<<<<<<<<
+ *         self.stack[-1] = (dfa, newstate, node)
+ * 
+ */
+    __pyx_2 = __Pyx_GetItemInt(__pyx_v_node, -1, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_3 = __Pyx_PyObject_Append(__pyx_2, __pyx_v_newnode); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_2); __pyx_2 = 0;
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":128
+ *         if newnode is not None:
+ *             node[-1].append(newnode)
+ *         self.stack[-1] = (dfa, newstate, node)             # <<<<<<<<<<<<<<
+ * 
+ *     cdef void push(self, type, newdfa, newstate, context):
+ */
+  __pyx_1 = PyTuple_New(3); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_INCREF(__pyx_v_dfa);
+  PyTuple_SET_ITEM(__pyx_1, 0, __pyx_v_dfa);
+  Py_INCREF(__pyx_v_newstate);
+  PyTuple_SET_ITEM(__pyx_1, 1, __pyx_v_newstate);
+  Py_INCREF(__pyx_v_node);
+  PyTuple_SET_ITEM(__pyx_1, 2, __pyx_v_node);
+  if (__Pyx_SetItemInt(__pyx_v_self->stack, -1, ((PyObject *)__pyx_1), 0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  Py_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
+
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  Py_XDECREF(__pyx_1);
+  Py_XDECREF(__pyx_2);
+  Py_XDECREF(__pyx_3);
+  __Pyx_WriteUnraisable("sphinx.pycode.pgen2.parse.Parser.shift");
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_dfa);
+  Py_DECREF(__pyx_v_state);
+  Py_DECREF(__pyx_v_node);
+  Py_DECREF(__pyx_v_newnode);
+}
+
+/* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":130
+ *         self.stack[-1] = (dfa, newstate, node)
+ * 
+ *     cdef void push(self, type, newdfa, newstate, context):             # <<<<<<<<<<<<<<
+ *         """Push a nonterminal.  (Internal)"""
+ *         dfa, state, node = self.stack[-1]
+ */
+
+static  void __pyx_f_6sphinx_6pycode_5pgen2_5parse_6Parser_push(struct __pyx_obj_6sphinx_6pycode_5pgen2_5parse_Parser *__pyx_v_self, PyObject *__pyx_v_type, PyObject *__pyx_v_newdfa, PyObject *__pyx_v_newstate, PyObject *__pyx_v_context) {
+  PyObject *__pyx_v_dfa;
+  PyObject *__pyx_v_state;
+  PyObject *__pyx_v_node;
+  PyObject *__pyx_v_newnode;
+  PyObject *__pyx_1 = 0;
+  PyObject *__pyx_2 = 0;
+  PyObject *__pyx_3 = 0;
+  __pyx_v_dfa = Py_None; Py_INCREF(Py_None);
+  __pyx_v_state = Py_None; Py_INCREF(Py_None);
+  __pyx_v_node = Py_None; Py_INCREF(Py_None);
+  __pyx_v_newnode = Py_None; Py_INCREF(Py_None);
+
+  /* "/home/gbr/devel/sphinx/sphinx/pycode/pgen2/parse.pyx":132
+ *     cdef void push(self, type, newdfa, newstate, context):
+ *         """Push a nonterminal.  (Internal)"""
+ *         dfa, state, node = self.stack[-1]             # <<<<<<<<<<<<<<
+ *         newnode = (type, None, context, [])
+ *         self.stack[-1] = (dfa, newstate, node)
+ */
+  __pyx_1 = __Pyx_GetItemInt(__pyx_v_self->stack, -1, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyTuple_CheckExact(__pyx_1) && PyTuple_GET_SIZE(__pyx_1) == 3) {
+    PyObject* tuple = __pyx_1;
+    __pyx_3 = PyTuple_GET_ITEM(tuple, 0);
+    Py_INCREF(__pyx_3);
+    Py_DECREF(__pyx_v_dfa);
+    __pyx_v_dfa = __pyx_3;
+    __pyx_3 = 0;
+    __pyx_3 = PyTuple_GET_ITEM(tuple, 1);
+    Py_INCREF(__pyx_3);
+    Py_DECREF(__pyx_v_state);
+    __pyx_v_state = __pyx_3;
+    __pyx_3 = 0;
+    __pyx_3 = PyTuple_GET_ITEM(tuple, 2);
+    Py_INCREF(__pyx_3);
+    Py_DECREF(__pyx_v_node);
+    __pyx_v_node = __pyx_3;
+    __pyx_3 = 0;
+    Py_DECREF(__pyx_1); __pyx_1 = 0;
+  }
+  else {
+    __pyx_2 = PyObject_GetIter(__pyx_1); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_1); __pyx_1 = 0;
+    __pyx_3 = __Pyx_UnpackItem(__pyx_2, 0); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_v_dfa);
+    __pyx_v_dfa = __pyx_3;
+    __pyx_3 = 0;
+    __pyx_3 = __Pyx_UnpackItem(__pyx_2, 1); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_v_state);
+    __pyx_v_state = __pyx_3;
+    __pyx_3 = 0;
+    __pyx_3 = __Pyx_UnpackItem(__pyx_2, 2); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    Py_DECREF(__pyx_v_node);