<html>
<head>
<title>PLY (Python Lex-Yacc)</title>
</head>
<body bgcolor="#ffffff">

<h1>PLY (Python Lex-Yacc)</h1>
 
<b>
David M. Beazley <br>
dave@dabeaz.com<br>
</b>

<p>
<b>PLY Version: 3.10</b>
<p>

<!-- INDEX -->
<div class="sectiontoc">
<ul>
<li><a href="#ply_nn1">Preface and Requirements</a>
<li><a href="#ply_nn1">Introduction</a>
<li><a href="#ply_nn2">PLY Overview</a>
<li><a href="#ply_nn3">Lex</a>
<ul>
<li><a href="#ply_nn4">Lex Example</a>
<li><a href="#ply_nn5">The tokens list</a>
<li><a href="#ply_nn6">Specification of tokens</a>
<li><a href="#ply_nn7">Token values</a>
<li><a href="#ply_nn8">Discarded tokens</a>
<li><a href="#ply_nn9">Line numbers and positional information</a>
<li><a href="#ply_nn10">Ignored characters</a>
<li><a href="#ply_nn11">Literal characters</a>
<li><a href="#ply_nn12">Error handling</a>
<li><a href="#ply_nn14">EOF Handling</a>
<li><a href="#ply_nn13">Building and using the lexer</a>
<li><a href="#ply_nn14">The @TOKEN decorator</a>
<li><a href="#ply_nn15">Optimized mode</a>
<li><a href="#ply_nn16">Debugging</a>
<li><a href="#ply_nn17">Alternative specification of lexers</a>
<li><a href="#ply_nn18">Maintaining state</a>
<li><a href="#ply_nn19">Lexer cloning</a>
<li><a href="#ply_nn20">Internal lexer state</a>
<li><a href="#ply_nn21">Conditional lexing and start conditions</a>
<li><a href="#ply_nn21">Miscellaneous Issues</a>
</ul>
<li><a href="#ply_nn22">Parsing basics</a>
<li><a href="#ply_nn23">Yacc</a>
<ul>
<li><a href="#ply_nn24">An example</a>
<li><a href="#ply_nn25">Combining Grammar Rule Functions</a>
<li><a href="#ply_nn26">Character Literals</a>
<li><a href="#ply_nn26">Empty Productions</a>
<li><a href="#ply_nn28">Changing the starting symbol</a>
<li><a href="#ply_nn27">Dealing With Ambiguous Grammars</a>
<li><a href="#ply_nn28">The parser.out file</a>
<li><a href="#ply_nn29">Syntax Error Handling</a>
<ul>
<li><a href="#ply_nn30">Recovery and resynchronization with error rules</a>
<li><a href="#ply_nn31">Panic mode recovery</a>
<li><a href="#ply_nn35">Signalling an error from a production</a>
<li><a href="#ply_nn38">When Do Syntax Errors Get Reported</a>
<li><a href="#ply_nn32">General comments on error handling</a>
</ul>
<li><a href="#ply_nn33">Line Number and Position Tracking</a>
<li><a href="#ply_nn34">AST Construction</a>
<li><a href="#ply_nn35">Embedded Actions</a>
<li><a href="#ply_nn36">Miscellaneous Yacc Notes</a>
</ul>
<li><a href="#ply_nn37">Multiple Parsers and Lexers</a>
<li><a href="#ply_nn38">Using Python's Optimized Mode</a>
<li><a href="#ply_nn44">Advanced Debugging</a>
<ul>
<li><a href="#ply_nn45">Debugging the lex() and yacc() commands</a>
<li><a href="#ply_nn46">Run-time Debugging</a>
</ul>
<li><a href="#ply_nn49">Packaging Advice</a>
<li><a href="#ply_nn39">Where to go from here?</a>
</ul>
</div>
<!-- INDEX -->






<H2><a name="ply_nn1"></a>1. Preface and Requirements</H2>


<p>
This document provides an overview of lexing and parsing with PLY.
Given the intrinsic complexity of parsing, I would strongly advise 
that you read (or at least skim) this entire document before jumping
into a big development project with PLY.  
</p>

<p>
PLY-3.5 is compatible with both Python 2 and Python 3.  If you are using
Python 2, you have to use Python 2.6 or newer.
</p>

<H2><a name="ply_nn1"></a>2. Introduction</H2>


PLY is a pure-Python implementation of the popular compiler
construction tools lex and yacc. The main goal of PLY is to stay
fairly faithful to the way in which traditional lex/yacc tools work.
This includes supporting LALR(1) parsing as well as providing
extensive input validation, error reporting, and diagnostics.  Thus,
if you've used yacc in another programming language, it should be
relatively straightforward to use PLY.  

<p>
Early versions of PLY were developed to support an Introduction to
Compilers Course I taught in 2001 at the University of Chicago. 
Since PLY was primarily developed as an instructional tool, you will
find it to be fairly picky about token and grammar rule
specification. In part, this
added formality is meant to catch common programming mistakes made by
novice users.  However, advanced users will also find such features to
be useful when building complicated grammars for real programming
languages.  It should also be noted that PLY does not provide much in
the way of bells and whistles (e.g., automatic construction of
abstract syntax trees, tree traversal, etc.). Nor would I consider it
to be a parsing framework.  Instead, you will find a bare-bones, yet
fully capable lex/yacc implementation written entirely in Python.

<p>
The rest of this document assumes that you are somewhat familiar with
parsing theory, syntax directed translation, and the use of compiler
construction tools such as lex and yacc in other programming
languages. If you are unfamiliar with these topics, you will probably
want to consult an introductory text such as "Compilers: Principles,
Techniques, and Tools", by Aho, Sethi, and Ullman.  O'Reilly's "Lex
and Yacc" by John Levine may also be handy.  In fact, the O'Reilly book can be
used as a reference for PLY as the concepts are virtually identical.

<H2><a name="ply_nn2"></a>3. PLY Overview</H2>


<p>
PLY consists of two separate modules; <tt>lex.py</tt> and
<tt>yacc.py</tt>, both of which are found in a Python package
called <tt>ply</tt>. The <tt>lex.py</tt> module is used to break input text into a
collection of tokens specified by a collection of regular expression
rules.  <tt>yacc.py</tt> is used to recognize language syntax that has
been specified in the form of a context free grammar.
</p>

<p>
The two tools are meant to work together.  Specifically,
<tt>lex.py</tt> provides an external interface in the form of a
<tt>token()</tt> function that returns the next valid token on the
input stream.  <tt>yacc.py</tt> calls this repeatedly to retrieve
tokens and invoke grammar rules.  The output of <tt>yacc.py</tt> is
often an Abstract Syntax Tree (AST).  However, this is entirely up to
the user.  If desired, <tt>yacc.py</tt> can also be used to implement
simple one-pass compilers.  

<p>
Like its Unix counterpart, <tt>yacc.py</tt> provides most of the
features you expect including extensive error checking, grammar
validation, support for empty productions, error tokens, and ambiguity
resolution via precedence rules.  In fact, almost everything that is possible in traditional yacc 
should be supported in PLY.

<p>
The primary difference between
<tt>yacc.py</tt> and Unix <tt>yacc</tt> is that <tt>yacc.py</tt> 
doesn't involve a separate code-generation process. 
Instead, PLY relies on reflection (introspection)
to build its lexers and parsers.  Unlike traditional lex/yacc which
require a special input file that is converted into a separate source
file, the specifications given to PLY <em>are</em> valid Python
programs.  This means that there are no extra source files nor is
there a special compiler construction step (e.g., running yacc to
generate Python code for the compiler).  Since the generation of the
parsing tables is relatively expensive, PLY caches the results and
saves them to a file.  If no changes are detected in the input source,
the tables are read from the cache. Otherwise, they are regenerated.

<H2><a name="ply_nn3"></a>4. Lex</H2>


<tt>lex.py</tt> is used to tokenize an input string.  For example, suppose
you're writing a programming language and a user supplied the following input string:

<blockquote>
<pre>
x = 3 + 42 * (s - t)
</pre>
</blockquote>

A tokenizer splits the string into individual tokens

<blockquote>
<pre>
'x','=', '3', '+', '42', '*', '(', 's', '-', 't', ')'
</pre>
</blockquote>

Tokens are usually given names to indicate what they are. For example:

<blockquote>
<pre>
'ID','EQUALS','NUMBER','PLUS','NUMBER','TIMES',
'LPAREN','ID','MINUS','ID','RPAREN'
</pre>
</blockquote>

More specifically, the input is broken into pairs of token types and values.  For example:

<blockquote>
<pre>
('ID','x'), ('EQUALS','='), ('NUMBER','3'), 
('PLUS','+'), ('NUMBER','42), ('TIMES','*'),
('LPAREN','('), ('ID','s'), ('MINUS','-'),
('ID','t'), ('RPAREN',')'
</pre>
</blockquote>

The identification of tokens is typically done by writing a series of regular expression
rules.  The next section shows how this is done using <tt>lex.py</tt>.

<H3><a name="ply_nn4"></a>4.1 Lex Example</H3>


The following example shows how <tt>lex.py</tt> is used to write a simple tokenizer.

<blockquote>
<pre>
# ------------------------------------------------------------
# calclex.py
#
# tokenizer for a simple expression evaluator for
# numbers and +,-,*,/
# ------------------------------------------------------------
import ply.lex as lex

# List of token names.   This is always required
tokens = (
   'NUMBER',
   'PLUS',
   'MINUS',
   'TIMES',
   'DIVIDE',
   'LPAREN',
   'RPAREN',
)

# Regular expression rules for simple tokens
t_PLUS    = r'\+'
t_MINUS   = r'-'
t_TIMES   = r'\*'
t_DIVIDE  = r'/'
t_LPAREN  = r'\('
t_RPAREN  = r'\)'

# A regular expression rule with some action code
def t_NUMBER(t):
    r'\d+'
    t.value = int(t.value)    
    return t

# Define a rule so we can track line numbers
def t_newline(t):
    r'\n+'
    t.lexer.lineno += len(t.value)

# A string containing ignored characters (spaces and tabs)
t_ignore  = ' \t'

# Error handling rule
def t_error(t):
    print("Illegal character '%s'" % t.value[0])
    t.lexer.skip(1)

# Build the lexer
lexer = lex.lex()

</pre>
</blockquote>
To use the lexer, you first need to feed it some input text using
its <tt>input()</tt> method.  After that, repeated calls
to <tt>token()</tt> produce tokens.  The following code shows how this
works:

<blockquote>
<pre>

# Test it out
data = '''
3 + 4 * 10
  + -20 *2
'''

# Give the lexer some input
lexer.input(data)

# Tokenize
while True:
    tok = lexer.token()
    if not tok: 
        break      # No more input
    print(tok)
</pre>
</blockquote>

When executed, the example will produce the following output:

<blockquote>
<pre>
$ python example.py
LexToken(NUMBER,3,2,1)
LexToken(PLUS,'+',2,3)
LexToken(NUMBER,4,2,5)
LexToken(TIMES,'*',2,7)
LexToken(NUMBER,10,2,10)
LexToken(PLUS,'+',3,14)
LexToken(MINUS,'-',3,16)
LexToken(NUMBER,20,3,18)
LexToken(TIMES,'*',3,20)
LexToken(NUMBER,2,3,21)
</pre>
</blockquote>

Lexers also support the iteration protocol.    So, you can write the above loop as follows:

<blockquote>
<pre>
for tok in lexer:
    print(tok)
</pre>
</blockquote>

The tokens returned by <tt>lexer.token()</tt> are instances
of <tt>LexToken</tt>.  This object has
attributes <tt>tok.type</tt>, <tt>tok.value</tt>,
<tt>tok.lineno</tt>, and <tt>tok.lexpos</tt>.  The following code shows an example of
accessing these attributes:

<blockquote>
<pre>
# Tokenize
while True:
    tok = lexer.token()
    if not tok: 
        break      # No more input
    print(tok.type, tok.value, tok.lineno, tok.lexpos)
</pre>
</blockquote>

The <tt>tok.type</tt> and <tt>tok.value</tt> attributes contain the
type and value of the token itself. 
<tt>tok.line</tt> and <tt>tok.lexpos</tt> contain information about
the location of the token.  <tt>tok.lexpos</tt> is the index of the
token relative to the start of the input text.

<H3><a name="ply_nn5"></a>4.2 The tokens list</H3>


<p>
All lexers must provide a list <tt>tokens</tt> that defines all of the possible token
names that can be produced by the lexer.  This list is always required
and is used to perform a variety of validation checks.  The tokens list is also used by the
<tt>yacc.py</tt> module to identify terminals.
</p>

<p>
In the example, the following code specified the token names:

<blockquote>
<pre>
tokens = (
   'NUMBER',
   'PLUS',
   'MINUS',
   'TIMES',
   'DIVIDE',
   'LPAREN',
   'RPAREN',
)
</pre>
</blockquote>

<H3><a name="ply_nn6"></a>4.3 Specification of tokens</H3>


Each token is specified by writing a regular expression rule compatible with Python's <tt>re</tt> module.  Each of these rules
are defined by  making declarations with a special prefix <tt>t_</tt> to indicate that it
defines a token.  For simple tokens, the regular expression can
be specified as strings such as this (note: Python raw strings are used since they are the
most convenient way to write regular expression strings):

<blockquote>
<pre>
t_PLUS = r'\+'
</pre>
</blockquote>

In this case, the name following the <tt>t_</tt> must exactly match one of the
names supplied in <tt>tokens</tt>.   If some kind of action needs to be performed,
a token rule can be specified as a function.  For example, this rule matches numbers and
converts the string into a Python integer.

<blockquote>
<pre>
def t_NUMBER(t):
    r'\d+'
    t.value = int(t.value)
    return t
</pre>
</blockquote>

When a function is used, the regular expression rule is specified in the function documentation string. 
The function always takes a single argument which is an instance of 
<tt>LexToken</tt>.   This object has attributes of <tt>t.type</tt> which is the token type (as a string),
<tt>t.value</tt> which is the lexeme (the actual text matched), <tt>t.lineno</tt> which is the current line number, and <tt>t.lexpos</tt> which
is the position of the token relative to the beginning of the input text.
By default, <tt>t.type</tt> is set to the name following the <tt>t_</tt> prefix.  The action
function can modify the contents of the <tt>LexToken</tt> object as appropriate.  However, 
when it is done, the resulting token should be returned.  If no value is returned by the action
function, the token is simply discarded and the next token read.

<p>
Internally, <tt>lex.py</tt> uses the <tt>re</tt> module to do its pattern matching.  Patterns are compiled
using the <tt>re.VERBOSE</tt> flag which can be used to help readability.  However, be aware that unescaped
whitespace is ignored and comments are allowed in this mode.  If your pattern involves whitespace, make sure you
use <tt>\s</tt>.  If you need to match the <tt>#</tt> character, use <tt>[#]</tt>.
</p>

<p>
When building the master regular expression,
rules are added in the following order:
</p>

<p>
<ol>
<li>All tokens defined by functions are added in the same order as they appear in the lexer file.
<li>Tokens defined by strings are added next by sorting them in order of decreasing regular expression length (longer expressions
are added first).
</ol>
<p>
Without this ordering, it can be difficult to correctly match certain types of tokens.  For example, if you 
wanted to have separate tokens for "=" and "==", you need to make sure that "==" is checked first.  By sorting regular
expressions in order of decreasing length, this problem is solved for rules defined as strings.  For functions,
the order can be explicitly controlled since rules appearing first are checked first.

<p>
To handle reserved words, you should write a single rule to match an
identifier and do a special name lookup in a function like this:

<blockquote>
<pre>
reserved = {
   'if' : 'IF',
   'then' : 'THEN',
   'else' : 'ELSE',
   'while' : 'WHILE',
   ...
}

tokens = ['LPAREN','RPAREN',...,'ID'] + list(reserved.values())

def t_ID(t):
    r'[a-zA-Z_][a-zA-Z_0-9]*'
    t.type = reserved.get(t.value,'ID')    # Check for reserved words
    return t
</pre>
</blockquote>

This approach greatly reduces the number of regular expression rules and is likely to make things a little faster.

<p>
<b>Note:</b> You should avoid writing individual rules for reserved words.  For example, if you write rules like this,

<blockquote>
<pre>
t_FOR   = r'for'
t_PRINT = r'print'
</pre>
</blockquote>

those rules will be triggered for identifiers that include those words as a prefix such as "forget" or "printed".  This is probably not
what you want.

<H3><a name="ply_nn7"></a>4.4 Token values</H3>


When tokens are returned by lex, they have a value that is stored in the <tt>value</tt> attribute.    Normally, the value is the text
that was matched.   However, the value can be assigned to any Python object.   For instance, when lexing identifiers, you may
want to return both the identifier name and information from some sort of symbol table.  To do this, you might write a rule like this:

<blockquote>
<pre>
def t_ID(t):
    ...
    # Look up symbol table information and return a tuple
    t.value = (t.value, symbol_lookup(t.value))
    ...
    return t
</pre>
</blockquote>

It is important to note that storing data in other attribute names is <em>not</em> recommended.  The <tt>yacc.py</tt> module only exposes the
contents of the <tt>value</tt> attribute.  Thus, accessing other attributes may  be unnecessarily awkward.   If you
need to store multiple values on a token, assign a tuple, dictionary, or instance to <tt>value</tt>.

<H3><a name="ply_nn8"></a>4.5 Discarded tokens</H3>


To discard a token, such as a comment, simply define a token rule that returns no value.  For example:

<blockquote>
<pre>
def t_COMMENT(t):
    r'\#.*'
    pass
    # No return value. Token discarded
</pre>
</blockquote>

Alternatively, you can include the prefix "ignore_" in the token declaration to force a token to be ignored.  For example:

<blockquote>
<pre>
t_ignore_COMMENT = r'\#.*'
</pre>
</blockquote>

Be advised that if you are ignoring many different kinds of text, you may still want to use functions since these provide more precise
control over the order in which regular expressions are matched (i.e., functions are matched in order of specification whereas strings are
sorted by regular expression length).

<H3><a name="ply_nn9"></a>4.6 Line numbers and positional information</H3>


<p>By default, <tt>lex.py</tt> knows nothing about line numbers.  This is because <tt>lex.py</tt> doesn't know anything
about what constitutes a "line" of input (e.g., the newline character or even if the input is textual data).
To update this information, you need to write a special rule.  In the example, the <tt>t_newline()</tt> rule shows how to do this.

<blockquote>
<pre>
# Define a rule so we can track line numbers
def t_newline(t):
    r'\n+'
    t.lexer.lineno += len(t.value)
</pre>
</blockquote>
Within the rule, the <tt>lineno</tt> attribute of the underlying lexer <tt>t.lexer</tt> is updated.
After the line number is updated, the token is simply discarded since nothing is returned.

<p>
<tt>lex.py</tt> does not perform any kind of automatic column tracking.  However, it does record positional
information related to each token in the <tt>lexpos</tt> attribute.   Using this, it is usually possible to compute 
column information as a separate step.   For instance, just count backwards until you reach a newline.

<blockquote>
<pre>
# Compute column. 
#     input is the input text string
#     token is a token instance
def find_column(input, token):
    last_cr = input.rfind('\n', 0, token.lexpos)
    if last_cr < 0:
	last_cr = 0
    column = (token.lexpos - last_cr) + 1
    return column
</pre>
</blockquote>

Since column information is often only useful in the context of error handling, calculating the column
position can be performed when needed as opposed to doing it for each token.

<H3><a name="ply_nn10"></a>4.7 Ignored characters</H3>


<p>
The special <tt>t_ignore</tt> rule is reserved by <tt>lex.py</tt> for characters
that should be completely ignored in the input stream. 
Usually this is used to skip over whitespace and other non-essential characters. 
Although it is possible to define a regular expression rule for whitespace in a manner
similar to <tt>t_newline()</tt>, the use of <tt>t_ignore</tt> provides substantially better
lexing performance because it is handled as a special case and is checked in a much
more efficient manner than the normal regular expression rules.
</p>

<p>
The characters given in <tt>t_ignore</tt> are not ignored when such characters are part of
other regular expression patterns.  For example, if you had a rule to capture quoted text,
that pattern can include the ignored characters (which will be captured in the normal way).  The
main purpose of <tt>t_ignore</tt> is to ignore whitespace and other padding between the
tokens that you actually want to parse.
</p>

<H3><a name="ply_nn11"></a>4.8 Literal characters</H3>


<p>
Literal characters can be specified by defining a variable <tt>literals</tt> in your lexing module.  For example:

<blockquote>
<pre>
literals = [ '+','-','*','/' ]
</pre>
</blockquote>

or alternatively

<blockquote>
<pre>
literals = "+-*/"
</pre>
</blockquote>

A literal character is simply a single character that is returned "as is" when encountered by the lexer.  Literals are checked
after all of the defined regular expression rules.  Thus, if a rule starts with one of the literal characters, it will always 
take precedence.

<p>
When a literal token is returned, both its <tt>type</tt> and <tt>value</tt> attributes are set to the character itself. For example, <tt>'+'</tt>.
</p>

<p>
It's possible to write token functions that perform additional actions
when literals are matched.  However, you'll need to set the token type
appropriately. For example:
</p>

<blockquote>
<pre>
literals = [ '{', '}' ]

def t_lbrace(t):
    r'\{'
    t.type = '{'      # Set token type to the expected literal
    return t

def t_rbrace(t):
    r'\}'
    t.type = '}'      # Set token type to the expected literal
    return t
</pre>
</blockquote>

<H3><a name="ply_nn12"></a>4.9 Error handling</H3>


<p>
The <tt>t_error()</tt>
function is used to handle lexing errors that occur when illegal
characters are detected.  In this case, the <tt>t.value</tt> attribute contains the
rest of the input string that has not been tokenized.  In the example, the error function
was defined as follows:

<blockquote>
<pre>
# Error handling rule
def t_error(t):
    print("Illegal character '%s'" % t.value[0])
    t.lexer.skip(1)
</pre>
</blockquote>

In this case, we simply print the offending character and skip ahead one character by calling <tt>t.lexer.skip(1)</tt>.

<H3><a name="ply_nn14"></a>4.10 EOF Handling</H3>


<p>
The <tt>t_eof()</tt> function is used to handle an end-of-file (EOF) condition in the input.   As input, it
receives a token type <tt>'eof'</tt> with the <tt>lineno</tt> and <tt>lexpos</tt> attributes set appropriately.
The main use of this function is provide more input to the lexer so that it can continue to parse.  Here is an
example of how this works:
</p>

<blockquote>
<pre>
# EOF handling rule
def t_eof(t):
    # Get more input (Example)
    more = raw_input('... ')
    if more:
        self.lexer.input(more)
        return self.lexer.token()
    return None
</pre>
</blockquote>

<p>
The EOF function should return the next available token (by calling <tt>self.lexer.token())</tt> or <tt>None</tt> to
indicate no more data.   Be aware that setting more input with the <tt>self.lexer.input()</tt> method does
NOT reset the lexer state or the <tt>lineno</tt> attribute used for position tracking.   The <tt>lexpos</tt> 
attribute is reset so be aware of that if you're using it in error reporting.
</p>

<H3><a name="ply_nn13"></a>4.11 Building and using the lexer</H3>


<p>
To build the lexer, the function <tt>lex.lex()</tt> is used.  For example:</p>

<blockquote>
<pre>
lexer = lex.lex()
</pre>
</blockquote>

<p>This function
uses Python reflection (or introspection) to read the regular expression rules
out of the calling context and build the lexer. Once the lexer has been built, two methods can
be used to control the lexer.
</p>
<ul>
<li><tt>lexer.input(data)</tt>.   Reset the lexer and store a new input string.
<li><tt>lexer.token()</tt>.  Return the next token.  Returns a special <tt>LexToken</tt> instance on success or
None if the end of the input text has been reached.
</ul>

<H3><a name="ply_nn14"></a>4.12 The @TOKEN decorator</H3>


In some applications, you may want to define build tokens from as a series of
more complex regular expression rules.  For example:

<blockquote>
<pre>
digit            = r'([0-9])'
nondigit         = r'([_A-Za-z])'
identifier       = r'(' + nondigit + r'(' + digit + r'|' + nondigit + r')*)'        

def t_ID(t):
    # want docstring to be identifier above. ?????
    ...
</pre>
</blockquote>

In this case, we want the regular expression rule for <tt>ID</tt> to be one of the variables above. However, there is no
way to directly specify this using a normal documentation string.   To solve this problem, you can use the <tt>@TOKEN</tt>
decorator.  For example:

<blockquote>
<pre>
from ply.lex import TOKEN

@TOKEN(identifier)
def t_ID(t):
    ...
</pre>
</blockquote>

<p>
This will attach <tt>identifier</tt> to the docstring for <tt>t_ID()</tt> allowing <tt>lex.py</tt> to work normally. 
</p>

<H3><a name="ply_nn15"></a>4.13 Optimized mode</H3>


For improved performance, it may be desirable to use Python's
optimized mode (e.g., running Python with the <tt>-O</tt>
option). However, doing so causes Python to ignore documentation
strings.  This presents special problems for <tt>lex.py</tt>.  To
handle this case, you can create your lexer using
the <tt>optimize</tt> option as follows:

<blockquote>
<pre>
lexer = lex.lex(optimize=1)
</pre>
</blockquote>

Next, run Python in its normal operating mode.  When you do
this, <tt>lex.py</tt> will write a file called <tt>lextab.py</tt> in
the same directory as the module containing the lexer specification.
This file contains all of the regular
expression rules and tables used during lexing.  On subsequent
executions,
<tt>lextab.py</tt> will simply be imported to build the lexer.  This
approach substantially improves the startup time of the lexer and it
works in Python's optimized mode.

<p>
To change the name of the lexer-generated module, use the <tt>lextab</tt> keyword argument.  For example:
</p>

<blockquote>
<pre>
lexer = lex.lex(optimize=1,lextab="footab")
</pre>
</blockquote>

When running in optimized mode, it is important to note that lex disables most error checking.  Thus, this is really only recommended
if you're sure everything is working correctly and you're ready to start releasing production code.

<H3><a name="ply_nn16"></a>4.14 Debugging</H3>


For the purpose of debugging, you can run <tt>lex()</tt> in a debugging mode as follows:

<blockquote>
<pre>
lexer = lex.lex(debug=1)
</pre>
</blockquote>

<p>
This will produce various sorts of debugging information including all of the added rules,
the master regular expressions used by the lexer, and tokens generating during lexing.
</p>

<p>
In addition, <tt>lex.py</tt> comes with a simple main function which
will either tokenize input read from standard input or from a file specified
on the command line. To use it, simply put this in your lexer:
</p>

<blockquote>
<pre>
if __name__ == '__main__':
     lex.runmain()
</pre>
</blockquote>

Please refer to the "Debugging" section near the end for some more advanced details 
of debugging.

<H3><a name="ply_nn17"></a>4.15 Alternative specification of lexers</H3>


As shown in the example, lexers are specified all within one Python module.   If you want to
put token rules in a different module from the one in which you invoke <tt>lex()</tt>, use the
<tt>module</tt> keyword argument.

<p>
For example, you might have a dedicated module that just contains
the token rules:

<blockquote>
<pre>
# module: tokrules.py
# This module just contains the lexing rules

# List of token names.   This is always required
tokens = (
   'NUMBER',
   'PLUS',
   'MINUS',
   'TIMES',
   'DIVIDE',
   'LPAREN',
   'RPAREN',
)

# Regular expression rules for simple tokens
t_PLUS    = r'\+'
t_MINUS   = r'-'
t_TIMES   = r'\*'
t_DIVIDE  = r'/'
t_LPAREN  = r'\('
t_RPAREN  = r'\)'

# A regular expression rule with some action code
def t_NUMBER(t):
    r'\d+'
    t.value = int(t.value)    
    return t

# Define a rule so we can track line numbers
def t_newline(t):
    r'\n+'
    t.lexer.lineno += len(t.value)

# A string containing ignored characters (spaces and tabs)
t_ignore  = ' \t'

# Error handling rule
def t_error(t):
    print("Illegal character '%s'" % t.value[0])
    t.lexer.skip(1)
</pre>
</blockquote>

Now, if you wanted to build a tokenizer from these rules from within a different module, you would do the following (shown for Python interactive mode):

<blockquote>
<pre>
>>> import tokrules
>>> <b>lexer = lex.lex(module=tokrules)</b>
>>> lexer.input("3 + 4")
>>> lexer.token()
LexToken(NUMBER,3,1,1,0)
>>> lexer.token()
LexToken(PLUS,'+',1,2)
>>> lexer.token()
LexToken(NUMBER,4,1,4)
>>> lexer.token()
None
>>>
</pre>
</blockquote>

The <tt>module</tt> option can also be used to define lexers from instances of a class.  For example:

<blockquote>
<pre>
import ply.lex as lex

class MyLexer(object):
    # List of token names.   This is always required
    tokens = (
       'NUMBER',
       'PLUS',
       'MINUS',
       'TIMES',
       'DIVIDE',
       'LPAREN',
       'RPAREN',
    )

    # Regular expression rules for simple tokens
    t_PLUS    = r'\+'
    t_MINUS   = r'-'
    t_TIMES   = r'\*'
    t_DIVIDE  = r'/'
    t_LPAREN  = r'\('
    t_RPAREN  = r'\)'

    # A regular expression rule with some action code
    # Note addition of self parameter since we're in a class
    def t_NUMBER(self,t):
        r'\d+'
        t.value = int(t.value)    
        return t

    # Define a rule so we can track line numbers
    def t_newline(self,t):
        r'\n+'
        t.lexer.lineno += len(t.value)

    # A string containing ignored characters (spaces and tabs)
    t_ignore  = ' \t'

    # Error handling rule
    def t_error(self,t):
        print("Illegal character '%s'" % t.value[0])
        t.lexer.skip(1)

    <b># Build the lexer
    def build(self,**kwargs):
        self.lexer = lex.lex(module=self, **kwargs)</b>
    
    # Test it output
    def test(self,data):
        self.lexer.input(data)
        while True:
             tok = self.lexer.token()
             if not tok: 
                 break
             print(tok)

# Build the lexer and try it out
m = MyLexer()
m.build()           # Build the lexer
m.test("3 + 4")     # Test it
</pre>
</blockquote>


When building a lexer from class, <em>you should construct the lexer from
an instance of the class</em>, not the class object itself.  This is because
PLY only works properly if the lexer actions are defined by bound-methods.

<p>
When using the <tt>module</tt> option to <tt>lex()</tt>, PLY collects symbols
from the underlying object using the <tt>dir()</tt> function. There is no
direct access to the <tt>__dict__</tt> attribute of the object supplied as a 
module value. </p>

<P>
Finally, if you want to keep things nicely encapsulated, but don't want to use a 
full-fledged class definition, lexers can be defined using closures.  For example:

<blockquote>
<pre>
import ply.lex as lex

# List of token names.   This is always required
tokens = (
  'NUMBER',
  'PLUS',
  'MINUS',
  'TIMES',
  'DIVIDE',
  'LPAREN',
  'RPAREN',
)

def MyLexer():
    # Regular expression rules for simple tokens
    t_PLUS    = r'\+'
    t_MINUS   = r'-'
    t_TIMES   = r'\*'
    t_DIVIDE  = r'/'
    t_LPAREN  = r'\('
    t_RPAREN  = r'\)'

    # A regular expression rule with some action code
    def t_NUMBER(t):
        r'\d+'
        t.value = int(t.value)    
        return t

    # Define a rule so we can track line numbers
    def t_newline(t):
        r'\n+'
        t.lexer.lineno += len(t.value)

    # A string containing ignored characters (spaces and tabs)
    t_ignore  = ' \t'

    # Error handling rule
    def t_error(t):
        print("Illegal character '%s'" % t.value[0])
        t.lexer.skip(1)

    # Build the lexer from my environment and return it    
    return lex.lex()
</pre>
</blockquote>

<p>
<b>Important note:</b> If you are defining a lexer using a class or closure, be aware that PLY still requires you to only
define a single lexer per module (source file).   There are extensive validation/error checking parts of the PLY that 
may falsely report error messages if you don't follow this rule.
</p>

<H3><a name="ply_nn18"></a>4.16 Maintaining state</H3>


In your lexer, you may want to maintain a variety of state
information.  This might include mode settings, symbol tables, and
other details.  As an example, suppose that you wanted to keep
track of how many NUMBER tokens had been encountered.  

<p>
One way to do this is to keep a set of global variables in the module
where you created the lexer.  For example: 

<blockquote>
<pre>
num_count = 0
def t_NUMBER(t):
    r'\d+'
    global num_count
    num_count += 1
    t.value = int(t.value)    
    return t
</pre>
</blockquote>

If you don't like the use of a global variable, another place to store
information is inside the Lexer object created by <tt>lex()</tt>.
To this, you can use the <tt>lexer</tt> attribute of tokens passed to
the various rules. For example:

<blockquote>
<pre>
def t_NUMBER(t):
    r'\d+'
    t.lexer.num_count += 1     # Note use of lexer attribute
    t.value = int(t.value)    
    return t

lexer = lex.lex()
lexer.num_count = 0            # Set the initial count
</pre>
</blockquote>

This latter approach has the advantage of being simple and working 
correctly in applications where multiple instantiations of a given
lexer exist in the same application.   However, this might also feel
like a gross violation of encapsulation to OO purists. 
Just to put your mind at some ease, all
internal attributes of the lexer (with the exception of <tt>lineno</tt>) have names that are prefixed
by <tt>lex</tt> (e.g., <tt>lexdata</tt>,<tt>lexpos</tt>, etc.).  Thus,
it is perfectly safe to store attributes in the lexer that
don't have names starting with that prefix or a name that conflicts with one of the
predefined methods (e.g., <tt>input()</tt>, <tt>token()</tt>, etc.).

<p>
If you don't like assigning values on the lexer object, you can define your lexer as a class as
shown in the previous section:

<blockquote>
<pre>
class MyLexer:
    ...
    def t_NUMBER(self,t):
        r'\d+'
        self.num_count += 1
        t.value = int(t.value)    
        return t

    def build(self, **kwargs):
        self.lexer = lex.lex(object=self,**kwargs)

    def __init__(self):
        self.num_count = 0
</pre>
</blockquote>

The class approach may be the easiest to manage if your application is
going to be creating multiple instances of the same lexer and you need
to manage a lot of state.

<p>
State can also be managed through closures.   For example, in Python 3:

<blockquote>
<pre>
def MyLexer():
    num_count = 0
    ...
    def t_NUMBER(t):
        r'\d+'
        nonlocal num_count
        num_count += 1
        t.value = int(t.value)    
        return t
    ...
</pre>
</blockquote>

<H3><a name="ply_nn19"></a>4.17 Lexer cloning</H3>


<p>
If necessary, a lexer object can be duplicated by invoking its <tt>clone()</tt> method.  For example:

<blockquote>
<pre>
lexer = lex.lex()
...
newlexer = lexer.clone()
</pre>
</blockquote>

When a lexer is cloned, the copy is exactly identical to the original lexer
including any input text and internal state. However, the clone allows a
different set of input text to be supplied which may be processed separately.
This may be useful in situations when you are writing a parser/compiler that
involves recursive or reentrant processing.  For instance, if you
needed to scan ahead in the input for some reason, you could create a
clone and use it to look ahead.  Or, if you were implementing some kind of preprocessor,
cloned lexers could be used to handle different input files.

<p>
Creating a clone is different than calling <tt>lex.lex()</tt> in that
PLY doesn't regenerate any of the internal tables or regular expressions.

<p>
Special considerations need to be made when cloning lexers that also
maintain their own internal state using classes or closures.  Namely,
you need to be aware that the newly created lexers will share all of
this state with the original lexer.  For example, if you defined a
lexer as a class and did this:

<blockquote>
<pre>
m = MyLexer()
a = lex.lex(object=m)      # Create a lexer

b = a.clone()              # Clone the lexer
</pre>
</blockquote>

Then both <tt>a</tt> and <tt>b</tt> are going to be bound to the same
object <tt>m</tt> and any changes to <tt>m</tt> will be reflected in both lexers.  It's
important to emphasize that <tt>clone()</tt> is only meant to create a new lexer
that reuses the regular expressions and environment of another lexer.  If you
need to make a totally new copy of a lexer, then call <tt>lex()</tt> again.

<H3><a name="ply_nn20"></a>4.18 Internal lexer state</H3>


A Lexer object <tt>lexer</tt> has a number of internal attributes that may be useful in certain
situations. 

<p>
<tt>lexer.lexpos</tt>
<blockquote>
This attribute is an integer that contains the current position within the input text.  If you modify
the value, it will change the result of the next call to <tt>token()</tt>.  Within token rule functions, this points
to the first character <em>after</em> the matched text.  If the value is modified within a rule, the next returned token will be
matched at the new position.
</blockquote>

<p>
<tt>lexer.lineno</tt>
<blockquote>
The current value of the line number attribute stored in the lexer.  PLY only specifies that the attribute
exists---it never sets, updates, or performs any processing with it.  If you want to track line numbers,
you will need to add code yourself (see the section on line numbers and positional information).
</blockquote>

<p>
<tt>lexer.lexdata</tt>
<blockquote>
The current input text stored in the lexer.  This is the string passed with the <tt>input()</tt> method. It
would probably be a bad idea to modify this unless you really know what you're doing.
</blockquote>

<P>
<tt>lexer.lexmatch</tt>
<blockquote>
This is the raw <tt>Match</tt> object returned by the Python <tt>re.match()</tt> function (used internally by PLY) for the
current token.  If you have written a regular expression that contains named groups, you can use this to retrieve those values.
Note: This attribute is only updated when tokens are defined and processed by functions.  
</blockquote>

<H3><a name="ply_nn21"></a>4.19 Conditional lexing and start conditions</H3>


In advanced parsing applications, it may be useful to have different
lexing states. For instance, you may want the occurrence of a certain
token or syntactic construct to trigger a different kind of lexing.
PLY supports a feature that allows the underlying lexer to be put into
a series of different states.  Each state can have its own tokens,
lexing rules, and so forth.  The implementation is based largely on
the "start condition" feature of GNU flex.  Details of this can be found
at <a
href="http://flex.sourceforge.net/manual/Start-Conditions.html">http://flex.sourceforge.net/manual/Start-Conditions.html</a>.

<p>
To define a new lexing state, it must first be declared.  This is done by including a "states" declaration in your
lex file.  For example:

<blockquote>
<pre>
states = (
   ('foo','exclusive'),
   ('bar','inclusive'),
)
</pre>
</blockquote>

This declaration declares two states, <tt>'foo'</tt>
and <tt>'bar'</tt>.  States may be of two types; <tt>'exclusive'</tt>
and <tt>'inclusive'</tt>.  An exclusive state completely overrides the
default behavior of the lexer.  That is, lex will only return tokens
and apply rules defined specifically for that state.  An inclusive
state adds additional tokens and rules to the default set of rules.
Thus, lex will return both the tokens defined by default in addition
to those defined for the inclusive state.

<p>
Once a state has been declared, tokens and rules are declared by including the
state name in token/rule declaration.  For example:

<blockquote>
<pre>
t_foo_NUMBER = r'\d+'                      # Token 'NUMBER' in state 'foo'        
t_bar_ID     = r'[a-zA-Z_][a-zA-Z0-9_]*'   # Token 'ID' in state 'bar'

def t_foo_newline(t):
    r'\n'
    t.lexer.lineno += 1
</pre>
</blockquote>

A token can be declared in multiple states by including multiple state names in the declaration. For example:

<blockquote>
<pre>
t_foo_bar_NUMBER = r'\d+'         # Defines token 'NUMBER' in both state 'foo' and 'bar'
</pre>
</blockquote>

Alternative, a token can be declared in all states using the 'ANY' in the name.

<blockquote>
<pre>
t_ANY_NUMBER = r'\d+'         # Defines a token 'NUMBER' in all states
</pre>
</blockquote>

If no state name is supplied, as is normally the case, the token is associated with a special state <tt>'INITIAL'</tt>.  For example,
these two declarations are identical:

<blockquote>
<pre>
t_NUMBER = r'\d+'
t_INITIAL_NUMBER = r'\d+'
</pre>
</blockquote>

<p>
States are also associated with the special <tt>t_ignore</tt>, <tt>t_error()</tt>, and <tt>t_eof()</tt> declarations.  For example, if a state treats
these differently, you can declare:</p>

<blockquote>
<pre>
t_foo_ignore = " \t\n"       # Ignored characters for state 'foo'

def t_bar_error(t):          # Special error handler for state 'bar'
    pass 
</pre>
</blockquote>

By default, lexing operates in the <tt>'INITIAL'</tt> state.  This state includes all of the normally defined tokens. 
For users who aren't using different states, this fact is completely transparent.   If, during lexing or parsing, you want to change
the lexing state, use the <tt>begin()</tt> method.   For example:

<blockquote>
<pre>
def t_begin_foo(t):
    r'start_foo'
    t.lexer.begin('foo')             # Starts 'foo' state
</pre>
</blockquote>

To get out of a state, you use <tt>begin()</tt> to switch back to the initial state.  For example:

<blockquote>
<pre>
def t_foo_end(t):
    r'end_foo'
    t.lexer.begin('INITIAL')        # Back to the initial state
</pre>
</blockquote>

The management of states can also be done with a stack.  For example:

<blockquote>
<pre>
def t_begin_foo(t):
    r'start_foo'
    t.lexer.push_state('foo')             # Starts 'foo' state

def t_foo_end(t):
    r'end_foo'
    t.lexer.pop_state()                   # Back to the previous state
</pre>
</blockquote>

<p>
The use of a stack would be useful in situations where there are many ways of entering a new lexing state and you merely want to go back
to the previous state afterwards.

<P>
An example might help clarify.  Suppose you were writing a parser and you wanted to grab sections of arbitrary C code enclosed by
curly braces.  That is, whenever you encounter a starting brace '{', you want to read all of the enclosed code up to the ending brace '}' 
and return it as a string.   Doing this with a normal regular expression rule is nearly (if not actually) impossible.  This is because braces can
be nested and can be included in comments and strings.  Thus, simply matching up to the first matching '}' character isn't good enough.  Here is how
you might use lexer states to do this:

<blockquote>
<pre>
# Declare the state
states = (
  ('ccode','exclusive'),
)

# Match the first {. Enter ccode state.
def t_ccode(t):
    r'\{'
    t.lexer.code_start = t.lexer.lexpos        # Record the starting position
    t.lexer.level = 1                          # Initial brace level
    t.lexer.begin('ccode')                     # Enter 'ccode' state

# Rules for the ccode state
def t_ccode_lbrace(t):     
    r'\{'
    t.lexer.level +=1                

def t_ccode_rbrace(t):
    r'\}'
    t.lexer.level -=1

    # If closing brace, return the code fragment
    if t.lexer.level == 0:
         t.value = t.lexer.lexdata[t.lexer.code_start:t.lexer.lexpos+1]
         t.type = "CCODE"
         t.lexer.lineno += t.value.count('\n')
         t.lexer.begin('INITIAL')           
         return t

# C or C++ comment (ignore)    
def t_ccode_comment(t):
    r'(/\*(.|\n)*?\*/)|(//.*)'
    pass

# C string
def t_ccode_string(t):
   r'\"([^\\\n]|(\\.))*?\"'

# C character literal
def t_ccode_char(t):
   r'\'([^\\\n]|(\\.))*?\''

# Any sequence of non-whitespace characters (not braces, strings)
def t_ccode_nonspace(t):
   r'[^\s\{\}\'\"]+'

# Ignored characters (whitespace)
t_ccode_ignore = " \t\n"

# For bad characters, we just skip over it
def t_ccode_error(t):
    t.lexer.skip(1)
</pre>
</blockquote>

In this example, the occurrence of the first '{' causes the lexer to record the starting position and enter a new state <tt>'ccode'</tt>.  A collection of rules then match
various parts of the input that follow (comments, strings, etc.).  All of these rules merely discard the token (by not returning a value).
However, if the closing right brace is encountered, the rule <tt>t_ccode_rbrace</tt> collects all of the code (using the earlier recorded starting
position), stores it, and returns a token 'CCODE' containing all of that text.  When returning the token, the lexing state is restored back to its
initial state.

<H3><a name="ply_nn21"></a>4.20 Miscellaneous Issues</H3>


<P>
<li>The lexer requires input to be supplied as a single input string.  Since most machines have more than enough memory, this 
rarely presents a performance concern.  However, it means that the lexer currently can't be used with streaming data
such as open files or sockets.  This limitation is primarily a side-effect of using the <tt>re</tt> module.  You might be
able to work around this by implementing an appropriate <tt>def t_eof()</tt> end-of-file handling rule. The main complication
here is that you'll probably need to ensure that data is fed to the lexer in a way so that it doesn't split in in the middle
of a token.</p>

<p>
<li>The lexer should work properly with both Unicode strings given as token and pattern matching rules as
well as for input text.

<p>
<li>If you need to supply optional flags to the re.compile() function, use the reflags option to lex.  For example:

<blockquote>
<pre>
lex.lex(reflags=re.UNICODE)
</pre>
</blockquote>

<p>
<li>Since the lexer is written entirely in Python, its performance is
largely determined by that of the Python <tt>re</tt> module.  Although
the lexer has been written to be as efficient as possible, it's not
blazingly fast when used on very large input files.  If
performance is concern, you might consider upgrading to the most
recent version of Python, creating a hand-written lexer, or offloading
the lexer into a C extension module.  

<p>
If you are going to create a hand-written lexer and you plan to use it with <tt>yacc.py</tt>, 
it only needs to conform to the following requirements:

<ul>
<li>It must provide a <tt>token()</tt> method that returns the next token or <tt>None</tt> if no more
tokens are available.
<li>The <tt>token()</tt> method must return an object <tt>tok</tt> that has <tt>type</tt> and <tt>value</tt> attributes.  If 
line number tracking is being used, then the token should also define a <tt>lineno</tt> attribute.
</ul>

<H2><a name="ply_nn22"></a>5. Parsing basics</H2>


<tt>yacc.py</tt> is used to parse language syntax.  Before showing an
example, there are a few important bits of background that must be
mentioned.  First, <em>syntax</em> is usually specified in terms of a BNF grammar.
For example, if you wanted to parse
simple arithmetic expressions, you might first write an unambiguous
grammar specification like this:

<blockquote>
<pre> 
expression : expression + term
           | expression - term
           | term

term       : term * factor
           | term / factor
           | factor

factor     : NUMBER
           | ( expression )
</pre>
</blockquote>

In the grammar, symbols such as <tt>NUMBER</tt>, <tt>+</tt>, <tt>-</tt>, <tt>*</tt>, and <tt>/</tt> are known
as <em>terminals</em> and correspond to raw input tokens.  Identifiers such as <tt>term</tt> and <tt>factor</tt> refer to 
grammar rules comprised of a collection of terminals and other rules.  These identifiers are known as <em>non-terminals</em>.
<P>

The semantic behavior of a language is often specified using a
technique known as syntax directed translation.  In syntax directed
translation, attributes are attached to each symbol in a given grammar
rule along with an action.  Whenever a particular grammar rule is
recognized, the action describes what to do.  For example, given the
expression grammar above, you might write the specification for a
simple calculator like this:

<blockquote>
<pre> 
Grammar                             Action
--------------------------------    -------------------------------------------- 
expression0 : expression1 + term    expression0.val = expression1.val + term.val
            | expression1 - term    expression0.val = expression1.val - term.val
            | term                  expression0.val = term.val

term0       : term1 * factor        term0.val = term1.val * factor.val
            | term1 / factor        term0.val = term1.val / factor.val
            | factor                term0.val = factor.val

factor      : NUMBER                factor.val = int(NUMBER.lexval)
            | ( expression )        factor.val = expression.val
</pre>
</blockquote>

A good way to think about syntax directed translation is to 
view each symbol in the grammar as a kind of object. Associated
with each symbol is a value representing its "state" (for example, the
<tt>val</tt> attribute above).    Semantic
actions are then expressed as a collection of functions or methods
that operate on the symbols and associated values.

<p>
Yacc uses a parsing technique known as LR-parsing or shift-reduce parsing.  LR parsing is a
bottom up technique that tries to recognize the right-hand-side of various grammar rules.
Whenever a valid right-hand-side is found in the input, the appropriate action code is triggered and the
grammar symbols are replaced by the grammar symbol on the left-hand-side. 

<p>
LR parsing is commonly implemented by shifting grammar symbols onto a
stack and looking at the stack and the next input token for patterns that
match one of the grammar rules.
The details of the algorithm can be found in a compiler textbook, but the
following example illustrates the steps that are performed if you
wanted to parse the expression
<tt>3 + 5 * (10 - 20)</tt> using the grammar defined above.  In the example,
the special symbol <tt>$</tt> represents the end of input.


<blockquote>
<pre>
Step Symbol Stack           Input Tokens            Action
---- ---------------------  ---------------------   -------------------------------
1                           3 + 5 * ( 10 - 20 )$    Shift 3
2    3                        + 5 * ( 10 - 20 )$    Reduce factor : NUMBER
3    factor                   + 5 * ( 10 - 20 )$    Reduce term   : factor
4    term                     + 5 * ( 10 - 20 )$    Reduce expr : term
5    expr                     + 5 * ( 10 - 20 )$    Shift +
6    expr +                     5 * ( 10 - 20 )$    Shift 5
7    expr + 5                     * ( 10 - 20 )$    Reduce factor : NUMBER
8    expr + factor                * ( 10 - 20 )$    Reduce term   : factor
9    expr + term                  * ( 10 - 20 )$    Shift *
10   expr + term *                  ( 10 - 20 )$    Shift (
11   expr + term * (                  10 - 20 )$    Shift 10
12   expr + term * ( 10                  - 20 )$    Reduce factor : NUMBER
13   expr + term * ( factor              - 20 )$    Reduce term : factor
14   expr + term * ( term                - 20 )$    Reduce expr : term
15   expr + term * ( expr                - 20 )$    Shift -
16   expr + term * ( expr -                20 )$    Shift 20
17   expr + term * ( expr - 20                )$    Reduce factor : NUMBER
18   expr + term * ( expr - factor            )$    Reduce term : factor
19   expr + term * ( expr - term              )$    Reduce expr : expr - term
20   expr + term * ( expr                     )$    Shift )
21   expr + term * ( expr )                    $    Reduce factor : (expr)
22   expr + term * factor                      $    Reduce term : term * factor
23   expr + term                               $    Reduce expr : expr + term
24   expr                                      $    Reduce expr
25                                             $    Success!
</pre>
</blockquote>

When parsing the expression, an underlying state machine and the
current input token determine what happens next.  If the next token
looks like part of a valid grammar rule (based on other items on the
stack), it is generally shifted onto the stack.  If the top of the
stack contains a valid right-hand-side of a grammar rule, it is
usually "reduced" and the symbols replaced with the symbol on the
left-hand-side.  When this reduction occurs, the appropriate action is
triggered (if defined).  If the input token can't be shifted and the
top of stack doesn't match any grammar rules, a syntax error has
occurred and the parser must take some kind of recovery step (or bail
out).  A parse is only successful if the parser reaches a state where
the symbol stack is empty and there are no more input tokens.

<p>
It is important to note that the underlying implementation is built
around a large finite-state machine that is encoded in a collection of
tables. The construction of these tables is non-trivial and
beyond the scope of this discussion.  However, subtle details of this
process explain why, in the example above, the parser chooses to shift
a token onto the stack in step 9 rather than reducing the
rule <tt>expr : expr + term</tt>.

<H2><a name="ply_nn23"></a>6. Yacc</H2>


The <tt>ply.yacc</tt> module implements the parsing component of PLY.
The name "yacc" stands for "Yet Another Compiler Compiler" and is
borrowed from the Unix tool of the same name.

<H3><a name="ply_nn24"></a>6.1 An example</H3>


Suppose you wanted to make a grammar for simple arithmetic expressions as previously described.   Here is
how you would do it with <tt>yacc.py</tt>:

<blockquote>
<pre>
# Yacc example

import ply.yacc as yacc

# Get the token map from the lexer.  This is required.
from calclex import tokens

def p_expression_plus(p):
    'expression : expression PLUS term'
    p[0] = p[1] + p[3]

def p_expression_minus(p):
    'expression : expression MINUS term'
    p[0] = p[1] - p[3]

def p_expression_term(p):
    'expression : term'
    p[0] = p[1]

def p_term_times(p):
    'term : term TIMES factor'
    p[0] = p[1] * p[3]

def p_term_div(p):
    'term : term DIVIDE factor'
    p[0] = p[1] / p[3]

def p_term_factor(p):
    'term : factor'
    p[0] = p[1]

def p_factor_num(p):
    'factor : NUMBER'
    p[0] = p[1]

def p_factor_expr(p):
    'factor : LPAREN expression RPAREN'
    p[0] = p[2]

# Error rule for syntax errors
def p_error(p):
    print("Syntax error in input!")

# Build the parser
parser = yacc.yacc()

while True:
   try:
       s = raw_input('calc > ')
   except EOFError:
       break
   if not s: continue
   result = parser.parse(s)
   print(result)
</pre>
</blockquote>

In this example, each grammar rule is defined by a Python function
where the docstring to that function contains the appropriate
context-free grammar specification.  The statements that make up the
function body implement the semantic actions of the rule. Each function
accepts a single argument <tt>p</tt> that is a sequence containing the
values of each grammar symbol in the corresponding rule.  The values
of <tt>p[i]</tt> are mapped to grammar symbols as shown here:

<blockquote>
<pre>
def p_expression_plus(p):
    'expression : expression PLUS term'
    #   ^            ^        ^    ^
    #  p[0]         p[1]     p[2] p[3]

    p[0] = p[1] + p[3]
</pre>
</blockquote>

<p>
For tokens, the "value" of the corresponding <tt>p[i]</tt> is the
<em>same</em> as the <tt>p.value</tt> attribute assigned in the lexer
module.  For non-terminals, the value is determined by whatever is
placed in <tt>p[0]</tt> when rules are reduced.  This value can be
anything at all.  However, it probably most common for the value to be
a simple Python type, a tuple, or an instance.  In this example, we
are relying on the fact that the <tt>NUMBER</tt> token stores an
integer value in its value field.  All of the other rules simply
perform various types of integer operations and propagate the result.
</p>

<p>
Note: The use of negative indices have a special meaning in
yacc---specially <tt>p[-1]</tt> does not have the same value
as <tt>p[3]</tt> in this example.  Please see the section on "Embedded
Actions" for further details.
</p>

<p>
The first rule defined in the yacc specification determines the
starting grammar symbol (in this case, a rule for <tt>expression</tt>
appears first).  Whenever the starting rule is reduced by the parser
and no more input is available, parsing stops and the final value is
returned (this value will be whatever the top-most rule placed
in <tt>p[0]</tt>). Note: an alternative starting symbol can be
specified using the <tt>start</tt> keyword argument to
<tt>yacc()</tt>.

<p>The <tt>p_error(p)</tt> rule is defined to catch syntax errors.
See the error handling section below for more detail.

<p>
To build the parser, call the <tt>yacc.yacc()</tt> function.  This
function looks at the module and attempts to construct all of the LR
parsing tables for the grammar you have specified.  The first
time <tt>yacc.yacc()</tt> is invoked, you will get a message such as
this:

<blockquote>
<pre>
$ python calcparse.py
Generating LALR tables
calc > 
</pre>
</blockquote>

<p>
Since table construction is relatively expensive (especially for large
grammars), the resulting parsing table is written to 
a file called <tt>parsetab.py</tt>.  In addition, a
debugging file called <tt>parser.out</tt> is created.  On subsequent
executions, <tt>yacc</tt> will reload the table from
<tt>parsetab.py</tt> unless it has detected a change in the underlying
grammar (in which case the tables and <tt>parsetab.py</tt> file are
regenerated).  Both of these files are written to the same directory
as the module in which the parser is specified.  
The name of the <tt>parsetab</tt> module can be changed using the
<tt>tabmodule</tt> keyword argument to <tt>yacc()</tt>.  For example:
</p>

<blockquote>
<pre>
parser = yacc.yacc(tabmodule='fooparsetab')
</pre>
</blockquote>

<p>
If any errors are detected in your grammar specification, <tt>yacc.py</tt> will produce
diagnostic messages and possibly raise an exception.  Some of the errors that can be detected include:

<ul>
<li>Duplicated function names (if more than one rule function have the same name in the grammar file).
<li>Shift/reduce and reduce/reduce conflicts generated by ambiguous grammars.
<li>Badly specified grammar rules.
<li>Infinite recursion (rules that can never terminate).
<li>Unused rules and tokens
<li>Undefined rules and tokens
</ul>

The next few sections discuss grammar specification in more detail.

<p>
The final part of the example shows how to actually run the parser
created by
<tt>yacc()</tt>.  To run the parser, you simply have to call
the <tt>parse()</tt> with a string of input text.  This will run all
of the grammar rules and return the result of the entire parse.  This
result return is the value assigned to <tt>p[0]</tt> in the starting
grammar rule.

<H3><a name="ply_nn25"></a>6.2 Combining Grammar Rule Functions</H3>


When grammar rules are similar, they can be combined into a single function.
For example, consider the two rules in our earlier example:

<blockquote>
<pre>
def p_expression_plus(p):
    'expression : expression PLUS term'
    p[0] = p[1] + p[3]

def p_expression_minus(t):
    'expression : expression MINUS term'
    p[0] = p[1] - p[3]
</pre>
</blockquote>

Instead of writing two functions, you might write a single function like this:

<blockquote>
<pre>
def p_expression(p):
    '''expression : expression PLUS term
                  | expression MINUS term'''
    if p[2] == '+':
        p[0] = p[1] + p[3]
    elif p[2] == '-':
        p[0] = p[1] - p[3]
</pre>
</blockquote>

In general, the doc string for any given function can contain multiple grammar rules.  So, it would
have also been legal (although possibly confusing) to write this:

<blockquote>
<pre>
def p_binary_operators(p):
    '''expression : expression PLUS term
                  | expression MINUS term
       term       : term TIMES factor
                  | term DIVIDE factor'''
    if p[2] == '+':
        p[0] = p[1] + p[3]
    elif p[2] == '-':
        p[0] = p[1] - p[3]
    elif p[2] == '*':
        p[0] = p[1] * p[3]
    elif p[2] == '/':
        p[0] = p[1] / p[3]
</pre>
</blockquote>

When combining grammar rules into a single function, it is usually a good idea for all of the rules to have
a similar structure (e.g., the same number of terms).  Otherwise, the corresponding action code may be more 
complicated than necessary.  However, it is possible to handle simple cases using len().  For example:

<blockquote>
<pre>
def p_expressions(p):
    '''expression : expression MINUS expression
                  | MINUS expression'''
    if (len(p) == 4):
        p[0] = p[1] - p[3]
    elif (len(p) == 3):
        p[0] = -p[2]
</pre>
</blockquote>

If parsing performance is a concern, you should resist the urge to put
too much conditional processing into a single grammar rule as shown in
these examples.  When you add checks to see which grammar rule is
being handled, you are actually duplicating the work that the parser
has already performed (i.e., the parser already knows exactly what rule it
matched).  You can eliminate this overhead by using a
separate <tt>p_rule()</tt> function for each grammar rule.

<H3><a name="ply_nn26"></a>6.3 Character Literals</H3>


If desired, a grammar may contain tokens defined as single character literals.   For example:

<blockquote>
<pre>
def p_binary_operators(p):
    '''expression : expression '+' term
                  | expression '-' term
       term       : term '*' factor
                  | term '/' factor'''
    if p[2] == '+':
        p[0] = p[1] + p[3]
    elif p[2] == '-':
        p[0] = p[1] - p[3]
    elif p[2] == '*':
        p[0] = p[1] * p[3]
    elif p[2] == '/':
        p[0] = p[1] / p[3]
</pre>
</blockquote>

A character literal must be enclosed in quotes such as <tt>'+'</tt>.  In addition, if literals are used, they must be declared in the
corresponding <tt>lex</tt> file through the use of a special <tt>literals</tt> declaration.

<blockquote>
<pre>
# Literals.  Should be placed in module given to lex()
literals = ['+','-','*','/' ]
</pre>
</blockquote>

<b>Character literals are limited to a single character</b>.  Thus, it is not legal to specify literals such as <tt>'&lt;='</tt> or <tt>'=='</tt>.  For this, use
the normal lexing rules (e.g., define a rule such as <tt>t_EQ = r'=='</tt>).

<H3><a name="ply_nn26"></a>6.4 Empty Productions</H3>


<tt>yacc.py</tt> can handle empty productions by defining a rule like this:

<blockquote>
<pre>
def p_empty(p):
    'empty :'
    pass
</pre>
</blockquote>

Now to use the empty production, simply use 'empty' as a symbol.  For example:

<blockquote>
<pre>
def p_optitem(p):
    'optitem : item'
    '        | empty'
    ...
</pre>
</blockquote>

Note: You can write empty rules anywhere by simply specifying an empty
right hand side.  However, I personally find that writing an "empty"
rule and using "empty" to denote an empty production is easier to read
and more clearly states your intentions.

<H3><a name="ply_nn28"></a>6.5 Changing the starting symbol</H3>


Normally, the first rule found in a yacc specification defines the starting grammar rule (top level rule).  To change this, simply
supply a <tt>start</tt> specifier in your file.  For example:

<blockquote>
<pre>
start = 'foo'

def p_bar(p):
    'bar : A B'

# This is the starting rule due to the start specifier above
def p_foo(p):
    'foo : bar X'
...
</pre>
</blockquote>

The use of a <tt>start</tt> specifier may be useful during debugging
since you can use it to have yacc build a subset of a larger grammar.
For this purpose, it is also possible to specify a starting symbol as
an argument to <tt>yacc()</tt>. For example:

<blockquote>
<pre>
parser = yacc.yacc(start='foo')
</pre>
</blockquote>

<H3><a name="ply_nn27"></a>6.6 Dealing With Ambiguous Grammars</H3>


The expression grammar given in the earlier example has been written
in a special format to eliminate ambiguity.  However, in many
situations, it is extremely difficult or awkward to write grammars in
this format.  A much more natural way to express the grammar is in a
more compact form like this:

<blockquote>
<pre>
expression : expression PLUS expression
           | expression MINUS expression
           | expression TIMES expression
           | expression DIVIDE expression
           | LPAREN expression RPAREN
           | NUMBER
</pre>
</blockquote>

Unfortunately, this grammar specification is ambiguous.  For example,
if you are parsing the string "3 * 4 + 5", there is no way to tell how
the operators are supposed to be grouped.  For example, does the
expression mean "(3 * 4) + 5" or is it "3 * (4+5)"?

<p>
When an ambiguous grammar is given to <tt>yacc.py</tt> it will print
messages about "shift/reduce conflicts" or "reduce/reduce conflicts".
A shift/reduce conflict is caused when the parser generator can't
decide whether or not to reduce a rule or shift a symbol on the
parsing stack.  For example, consider the string "3 * 4 + 5" and the
internal parsing stack:

<blockquote>
<pre>
Step Symbol Stack           Input Tokens            Action
---- ---------------------  ---------------------   -------------------------------
1    $                                3 * 4 + 5$    Shift 3
2    $ 3                                * 4 + 5$    Reduce : expression : NUMBER
3    $ expr                             * 4 + 5$    Shift *
4    $ expr *                             4 + 5$    Shift 4
5    $ expr * 4                             + 5$    Reduce: expression : NUMBER
6    $ expr * expr                          + 5$    SHIFT/REDUCE CONFLICT ????
</pre>
</blockquote>

In this case, when the parser reaches step 6, it has two options.  One
is to reduce the rule <tt>expr : expr * expr</tt> on the stack.  The
other option is to shift the token <tt>+</tt> on the stack.  Both
options are perfectly legal from the rules of the
context-free-grammar.

<p>
By default, all shift/reduce conflicts are resolved in favor of
shifting.  Therefore, in the above example, the parser will always
shift the <tt>+</tt> instead of reducing.  Although this strategy
works in many cases (for example, the case of 
"if-then" versus "if-then-else"), it is not enough for arithmetic expressions.  In fact,
in the above example, the decision to shift <tt>+</tt> is completely
wrong---we should have reduced <tt>expr * expr</tt> since
multiplication has higher mathematical precedence than addition.

<p>To resolve ambiguity, especially in expression
grammars, <tt>yacc.py</tt> allows individual tokens to be assigned a
precedence level and associativity.  This is done by adding a variable
<tt>precedence</tt> to the grammar file like this:

<blockquote>
<pre>
precedence = (
    ('left', 'PLUS', 'MINUS'),
    ('left', 'TIMES', 'DIVIDE'),
)
</pre>
</blockquote>

This declaration specifies that <tt>PLUS</tt>/<tt>MINUS</tt> have the
same precedence level and are left-associative and that
<tt>TIMES</tt>/<tt>DIVIDE</tt> have the same precedence and are
left-associative.  Within the <tt>precedence</tt> declaration, tokens
are ordered from lowest to highest precedence. Thus, this declaration
specifies that <tt>TIMES</tt>/<tt>DIVIDE</tt> have higher precedence
than <tt>PLUS</tt>/<tt>MINUS</tt> (since they appear later in the
precedence specification).

<p>
The precedence specification works by associating a numerical
precedence level value and associativity direction to the listed
tokens.  For example, in the above example you get:

<blockquote>
<pre>
PLUS      : level = 1,  assoc = 'left'
MINUS     : level = 1,  assoc = 'left'
TIMES     : level = 2,  assoc = 'left'
DIVIDE    : level = 2,  assoc = 'left'
</pre>
</blockquote>

These values are then used to attach a numerical precedence value and
associativity direction to each grammar rule. <em>This is always
determined by looking at the precedence of the right-most terminal
symbol.</em>  For example:

<blockquote>
<pre>
expression : expression PLUS expression                 # level = 1, left
           | expression MINUS expression                # level = 1, left
           | expression TIMES expression                # level = 2, left
           | expression DIVIDE expression               # level = 2, left
           | LPAREN expression RPAREN                   # level = None (not specified)
           | NUMBER                                     # level = None (not specified)
</pre>
</blockquote>

When shift/reduce conflicts are encountered, the parser generator resolves the conflict by
looking at the precedence rules and associativity specifiers.

<p>
<ol>
<li>If the current token has higher precedence than the rule on the stack, it is shifted.
<li>If the grammar rule on the stack has higher precedence, the rule is reduced.
<li>If the current token and the grammar rule have the same precedence, the
rule is reduced for left associativity, whereas the token is shifted for right associativity.
<li>If nothing is known about the precedence, shift/reduce conflicts are resolved in
favor of shifting (the default).
</ol>

For example, if "expression PLUS expression" has been parsed and the
next token is "TIMES", the action is going to be a shift because
"TIMES" has a higher precedence level than "PLUS".  On the other hand,
if "expression TIMES expression" has been parsed and the next token is
"PLUS", the action is going to be reduce because "PLUS" has a lower
precedence than "TIMES."

<p>
When shift/reduce conflicts are resolved using the first three
techniques (with the help of precedence rules), <tt>yacc.py</tt> will
report no errors or conflicts in the grammar (although it will print
some information in the <tt>parser.out</tt> debugging file).

<p>
One problem with the precedence specifier technique is that it is
sometimes necessary to change the precedence of an operator in certain
contexts.  For example, consider a unary-minus operator in "3 + 4 *
-5".  Mathematically, the unary minus is normally given a very high
precedence--being evaluated before the multiply.  However, in our
precedence specifier, MINUS has a lower precedence than TIMES.  To
deal with this, precedence rules can be given for so-called "fictitious tokens"
like this:

<blockquote>
<pre>
precedence = (
    ('left', 'PLUS', 'MINUS'),
    ('left', 'TIMES', 'DIVIDE'),
    ('right', 'UMINUS'),            # Unary minus operator
)
</pre>
</blockquote>

Now, in the grammar file, we can write our unary minus rule like this:

<blockquote>
<pre>
def p_expr_uminus(p):
    'expression : MINUS expression %prec UMINUS'
    p[0] = -p[2]
</pre>
</blockquote>

In this case, <tt>%prec UMINUS</tt> overrides the default rule precedence--setting it to that
of UMINUS in the precedence specifier.

<p>
At first, the use of UMINUS in this example may appear very confusing.
UMINUS is not an input token or a grammar rule.  Instead, you should
think of it as the name of a special marker in the precedence table.   When you use the <tt>%prec</tt> qualifier, you're simply
telling yacc that you want the precedence of the expression to be the same as for this special marker instead of the usual precedence.

<p>
It is also possible to specify non-associativity in the <tt>precedence</tt> table. This would
be used when you <em>don't</em> want operations to chain together.  For example, suppose
you wanted to support comparison operators like <tt>&lt;</tt> and <tt>&gt;</tt> but you didn't want to allow
combinations like <tt>a &lt; b &lt; c</tt>.   To do this, simply specify a rule like this:

<blockquote>
<pre>
precedence = (
    ('nonassoc', 'LESSTHAN', 'GREATERTHAN'),  # Nonassociative operators
    ('left', 'PLUS', 'MINUS'),
    ('left', 'TIMES', 'DIVIDE'),
    ('right', 'UMINUS'),            # Unary minus operator
)
</pre>
</blockquote>

<p>
If you do this, the occurrence of input text such as <tt> a &lt; b &lt; c</tt> will result in a syntax error.  However, simple
expressions such as <tt>a &lt; b</tt> will still be fine.

<p>
Reduce/reduce conflicts are caused when there are multiple grammar
rules that can be applied to a given set of symbols.  This kind of
conflict is almost always bad and is always resolved by picking the
rule that appears first in the grammar file.   Reduce/reduce conflicts
are almost always caused when different sets of grammar rules somehow
generate the same set of symbols.  For example:

<blockquote>
<pre>
assignment :  ID EQUALS NUMBER
           |  ID EQUALS expression
           
expression : expression PLUS expression
           | expression MINUS expression
           | expression TIMES expression
           | expression DIVIDE expression
           | LPAREN expression RPAREN
           | NUMBER
</pre>
</blockquote>

In this case, a reduce/reduce conflict exists between these two rules:

<blockquote>
<pre>
assignment  : ID EQUALS NUMBER
expression  : NUMBER
</pre>
</blockquote>

For example, if you wrote "a = 5", the parser can't figure out if this
is supposed to be reduced as <tt>assignment : ID EQUALS NUMBER</tt> or
whether it's supposed to reduce the 5 as an expression and then reduce
the rule <tt>assignment : ID EQUALS expression</tt>.

<p>
It should be noted that reduce/reduce conflicts are notoriously
difficult to spot simply looking at the input grammar.  When a
reduce/reduce conflict occurs, <tt>yacc()</tt> will try to help by
printing a warning message such as this:

<blockquote>
<pre>
WARNING: 1 reduce/reduce conflict
WARNING: reduce/reduce conflict in state 15 resolved using rule (assignment -> ID EQUALS NUMBER)
WARNING: rejected rule (expression -> NUMBER)
</pre>
</blockquote>

This message identifies the two rules that are in conflict.  However,
it may not tell you how the parser arrived at such a state.  To try
and figure it out, you'll probably have to look at your grammar and
the contents of the
<tt>parser.out</tt> debugging file with an appropriately high level of
caffeination.

<H3><a name="ply_nn28"></a>6.7 The parser.out file</H3>


Tracking down shift/reduce and reduce/reduce conflicts is one of the finer pleasures of using an LR
parsing algorithm.  To assist in debugging, <tt>yacc.py</tt> creates a debugging file called
'parser.out' when it generates the parsing table.   The contents of this file look like the following:

<blockquote>
<pre>
Unused terminals:


Grammar

Rule 1     expression -> expression PLUS expression
Rule 2     expression -> expression MINUS expression
Rule 3     expression -> expression TIMES expression
Rule 4     expression -> expression DIVIDE expression
Rule 5     expression -> NUMBER
Rule 6     expression -> LPAREN expression RPAREN

Terminals, with rules where they appear

TIMES                : 3
error                : 
MINUS                : 2
RPAREN               : 6
LPAREN               : 6
DIVIDE               : 4
PLUS                 : 1
NUMBER               : 5

Nonterminals, with rules where they appear

expression           : 1 1 2 2 3 3 4 4 6 0


Parsing method: LALR


state 0

    S' -> . expression
    expression -> . expression PLUS expression
    expression -> . expression MINUS expression
    expression -> . expression TIMES expression
    expression -> . expression DIVIDE expression
    expression -> . NUMBER
    expression -> . LPAREN expression RPAREN

    NUMBER          shift and go to state 3
    LPAREN          shift and go to state 2


state 1

    S' -> expression .
    expression -> expression . PLUS expression
    expression -> expression . MINUS expression
    expression -> expression . TIMES expression
    expression -> expression . DIVIDE expression

    PLUS            shift and go to state 6
    MINUS           shift and go to state 5
    TIMES           shift and go to state 4
    DIVIDE          shift and go to state 7


state 2

    expression -> LPAREN . expression RPAREN
    expression -> . expression PLUS expression
    expression -> . expression MINUS expression
    expression -> . expression TIMES expression
    expression -> . expression DIVIDE expression
    expression -> . NUMBER
    expression -> . LPAREN expression RPAREN

    NUMBER          shift and go to state 3
    LPAREN          shift and go to state 2


state 3

    expression -> NUMBER .

    $               reduce using rule 5
    PLUS            reduce using rule 5
    MINUS           reduce using rule 5
    TIMES           reduce using rule 5
    DIVIDE          reduce using rule 5
    RPAREN          reduce using rule 5


state 4

    expression -> expression TIMES . expression
    expression -> . expression PLUS expression
    expression -> . expression MINUS expression
    expression -> . expression TIMES expression
    expression -> . expression DIVIDE expression
    expression -> . NUMBER
    expression -> . LPAREN expression RPAREN

    NUMBER          shift and go to state 3
    LPAREN          shift and go to state 2


state 5

    expression -> expression MINUS . expression
    expression -> . expression PLUS expression
    expression -> . expression MINUS expression
    expression -> . expression TIMES expression
    expression -> . expression DIVIDE expression
    expression -> . NUMBER
    expression -> . LPAREN expression RPAREN

    NUMBER          shift and go to state 3
    LPAREN          shift and go to state 2


state 6

    expression -> expression PLUS . expression
    expression -> . expression PLUS expression
    expression -> . expression MINUS expression
    expression -> . expression TIMES expression
    expression -> . expression DIVIDE expression
    expression -> . NUMBER
    expression -> . LPAREN expression RPAREN

    NUMBER          shift and go to state 3
    LPAREN          shift and go to state 2


state 7

    expression -> expression DIVIDE . expression
    expression -> . expression PLUS expression
    expression -> . expression MINUS expression
    expression -> . expression TIMES expression
    expression -> . expression DIVIDE expression
    expression -> . NUMBER
    expression -> . LPAREN expression RPAREN

    NUMBER          shift and go to state 3
    LPAREN          shift and go to state 2


state 8

    expression -> LPAREN expression . RPAREN
    expression -> expression . PLUS expression
    expression -> expression . MINUS expression
    expression -> expression . TIMES expression
    expression -> expression . DIVIDE expression

    RPAREN          shift and go to state 13
    PLUS            shift and go to state 6
    MINUS           shift and go to state 5
    TIMES           shift and go to state 4
    DIVIDE          shift and go to state 7


state 9

    expression -> expression TIMES expression .
    expression -> expression . PLUS expression
    expression -> expression . MINUS expression
    expression -> expression . TIMES expression
    expression -> expression . DIVIDE expression

    $               reduce using rule 3
    PLUS            reduce using rule 3
    MINUS           reduce using rule 3
    TIMES           reduce using rule 3
    DIVIDE          reduce using rule 3
    RPAREN          reduce using rule 3

  ! PLUS            [ shift and go to state 6 ]
  ! MINUS           [ shift and go to state 5 ]
  ! TIMES           [ shift and go to state 4 ]
  ! DIVIDE          [ shift and go to state 7 ]

state 10

    expression -> expression MINUS expression .
    expression -> expression . PLUS expression
    expression -> expression . MINUS expression
    expression -> expression . TIMES expression
    expression -> expression . DIVIDE expression

    $               reduce using rule 2
    PLUS            reduce using rule 2
    MINUS           reduce using rule 2
    RPAREN          reduce using rule 2
    TIMES           shift and go to state 4
    DIVIDE          shift and go to state 7

  ! TIMES           [ reduce using rule 2 ]
  ! DIVIDE          [ reduce using rule 2 ]
  ! PLUS            [ shift and go to state 6 ]
  ! MINUS           [ shift and go to state 5 ]

state 11

    expression -> expression PLUS expression .
    expression -> expression . PLUS expression
    expression -> expression . MINUS expression
    expression -> expression . TIMES expression
    expression -> expression . DIVIDE expression

    $               reduce using rule 1
    PLUS            reduce using rule 1
    MINUS           reduce using rule 1
    RPAREN          reduce using rule 1
    TIMES           shift and go to state 4
    DIVIDE          shift and go to state 7

  ! TIMES           [ reduce using rule 1 ]
  ! DIVIDE          [ reduce using rule 1 ]
  ! PLUS            [ shift and go to state 6 ]
  ! MINUS           [ shift and go to state 5 ]

state 12

    expression -> expression DIVIDE expression .
    expression -> expression . PLUS expression
    expression -> expression . MINUS expression
    expression -> expression . TIMES expression
    expression -> expression . DIVIDE expression

    $               reduce using rule 4
    PLUS            reduce using rule 4
    MINUS           reduce using rule 4
    TIMES           reduce using rule 4
    DIVIDE          reduce using rule 4
    RPAREN          reduce using rule 4

  ! PLUS            [ shift and go to state 6 ]
  ! MINUS           [ shift and go to state 5 ]
  ! TIMES           [ shift and go to state 4 ]
  ! DIVIDE          [ shift and go to state 7 ]

state 13

    expression -> LPAREN expression RPAREN .

    $               reduce using rule 6
    PLUS            reduce using rule 6
    MINUS           reduce using rule 6
    TIMES           reduce using rule 6
    DIVIDE          reduce using rule 6
    RPAREN          reduce using rule 6
</pre>
</blockquote>

The different states that appear in this file are a representation of
every possible sequence of valid input tokens allowed by the grammar.
When receiving input tokens, the parser is building up a stack and
looking for matching rules.  Each state keeps track of the grammar
rules that might be in the process of being matched at that point.  Within each
rule, the "." character indicates the current location of the parse
within that rule.  In addition, the actions for each valid input token
are listed.  When a shift/reduce or reduce/reduce conflict arises,
rules <em>not</em> selected are prefixed with an !.  For example:

<blockquote>
<pre>
  ! TIMES           [ reduce using rule 2 ]
  ! DIVIDE          [ reduce using rule 2 ]
  ! PLUS            [ shift and go to state 6 ]
  ! MINUS           [ shift and go to state 5 ]
</pre>
</blockquote>

By looking at these rules (and with a little practice), you can usually track down the source
of most parsing conflicts.  It should also be stressed that not all shift-reduce conflicts are
bad.  However, the only way to be sure that they are resolved correctly is to look at <tt>parser.out</tt>.
  
<H3><a name="ply_nn29"></a>6.8 Syntax Error Handling</H3>


If you are creating a parser for production use, the handling of
syntax errors is important.  As a general rule, you don't want a
parser to simply throw up its hands and stop at the first sign of
trouble.  Instead, you want it to report the error, recover if possible, and
continue parsing so that all of the errors in the input get reported
to the user at once.   This is the standard behavior found in compilers
for languages such as C, C++, and Java.

In PLY, when a syntax error occurs during parsing, the error is immediately
detected (i.e., the parser does not read any more tokens beyond the
source of the error).  However, at this point, the parser enters a
recovery mode that can be used to try and continue further parsing.
As a general rule, error recovery in LR parsers is a delicate
topic that involves ancient rituals and black-magic.   The recovery mechanism
provided by <tt>yacc.py</tt> is comparable to Unix yacc so you may want
consult a book like O'Reilly's "Lex and Yacc" for some of the finer details.

<p>
When a syntax error occurs, <tt>yacc.py</tt> performs the following steps:

<ol>
<li>On the first occurrence of an error, the user-defined <tt>p_error()</tt> function
is called with the offending token as an argument. However, if the syntax error is due to
reaching the end-of-file, <tt>p_error()</tt> is called with an
  argument of <tt>None</tt>.
Afterwards, the parser enters
an "error-recovery" mode in which it will not make future calls to <tt>p_error()</tt> until it
has successfully shifted at least 3 tokens onto the parsing stack.

<p>
<li>If no recovery action is taken in <tt>p_error()</tt>, the offending lookahead token is replaced
with a special <tt>error</tt> token.

<p>
<li>If the offending lookahead token is already set to <tt>error</tt>, the top item of the parsing stack is
deleted.

<p>
<li>If the entire parsing stack is unwound, the parser enters a restart state and attempts to start
parsing from its initial state.

<p>
<li>If a grammar rule accepts <tt>error</tt> as a token, it will be
shifted onto the parsing stack.

<p>
<li>If the top item of the parsing stack is <tt>error</tt>, lookahead tokens will be discarded until the
parser can successfully shift a new symbol or reduce a rule involving <tt>error</tt>.
</ol>

<H4><a name="ply_nn30"></a>6.8.1 Recovery and resynchronization with error rules</H4>


The most well-behaved approach for handling syntax errors is to write grammar rules that include the <tt>error</tt>
token.  For example, suppose your language had a grammar rule for a print statement like this:

<blockquote>
<pre>
def p_statement_print(p):
     'statement : PRINT expr SEMI'
     ...
</pre>
</blockquote>

To account for the possibility of a bad expression, you might write an additional grammar rule like this:

<blockquote>
<pre>
def p_statement_print_error(p):
     'statement : PRINT error SEMI'
     print("Syntax error in print statement. Bad expression")

</pre>
</blockquote>

In this case, the <tt>error</tt> token will match any sequence of
tokens that might appear up to the first semicolon that is
encountered.  Once the semicolon is reached, the rule will be
invoked and the <tt>error</tt> token will go away.

<p>
This type of recovery is sometimes known as parser resynchronization.
The <tt>error</tt> token acts as a wildcard for any bad input text and
the token immediately following <tt>error</tt> acts as a
synchronization token.

<p>
It is important to note that the <tt>error</tt> token usually does not appear as the last token
on the right in an error rule.  For example:

<blockquote>
<pre>
def p_statement_print_error(p):
    'statement : PRINT error'
    print("Syntax error in print statement. Bad expression")
</pre>
</blockquote>

This is because the first bad token encountered will cause the rule to
be reduced--which may make it difficult to recover if more bad tokens
immediately follow.   

<H4><a name="ply_nn31"></a>6.8.2 Panic mode recovery</H4>


An alternative error recovery scheme is to enter a panic mode recovery in which tokens are
discarded to a point where the parser might be able to recover in some sensible manner.

<p>
Panic mode recovery is implemented entirely in the <tt>p_error()</tt> function.  For example, this
function starts discarding tokens until it reaches a closing '}'.  Then, it restarts the 
parser in its initial state.

<blockquote>
<pre>
def p_error(p):
    print("Whoa. You are seriously hosed.")
    if not p:
        print("End of File!")
        return

    # Read ahead looking for a closing '}'
    while True:
        tok = parser.token()             # Get the next token
        if not tok or tok.type == 'RBRACE': 
            break
    parser.restart()
</pre>
</blockquote>

<p>
This function simply discards the bad token and tells the parser that the error was ok.

<blockquote>
<pre>
def p_error(p):
    if p:
         print("Syntax error at token", p.type)
         # Just discard the token and tell the parser it's okay.
         parser.errok()
    else:
         print("Syntax error at EOF")
</pre>
</blockquote>

<P>
More information on these methods is as follows:
</p>

<p>
<ul>
<li><tt>parser.errok()</tt>.  This resets the parser state so it doesn't think it's in error-recovery
mode.   This will prevent an <tt>error</tt> token from being generated and will reset the internal
error counters so that the next syntax error will call <tt>p_error()</tt> again.

<p>
<li><tt>parser.token()</tt>.  This returns the next token on the input stream.

<p>
<li><tt>parser.restart()</tt>.  This discards the entire parsing stack and resets the parser
to its initial state. 
</ul>

<p>
To supply the next lookahead token to the parser, <tt>p_error()</tt> can return a token.  This might be
useful if trying to synchronize on special characters.  For example:

<blockquote>
<pre>
def p_error(p):
    # Read ahead looking for a terminating ";"
    while True:
        tok = parser.token()             # Get the next token
        if not tok or tok.type == 'SEMI': break
    parser.errok()

    # Return SEMI to the parser as the next lookahead token
    return tok  
</pre>
</blockquote>

<p>
Keep in mind in that the above error handling functions,
<tt>parser</tt> is an instance of the parser created by
<tt>yacc()</tt>.   You'll need to save this instance someplace in your
code so that you can refer to it during error handling.
</p>

<H4><a name="ply_nn35"></a>6.8.3 Signalling an error from a production</H4>


If necessary, a production rule can manually force the parser to enter error recovery.  This
is done by raising the <tt>SyntaxError</tt> exception like this:

<blockquote>
<pre>
def p_production(p):
    'production : some production ...'
    raise SyntaxError
</pre>
</blockquote>

The effect of raising <tt>SyntaxError</tt> is the same as if the last symbol shifted onto the
parsing stack was actually a syntax error.  Thus, when you do this, the last symbol shifted is popped off
of the parsing stack and the current lookahead token is set to an <tt>error</tt> token.   The parser
then enters error-recovery mode where it tries to reduce rules that can accept <tt>error</tt> tokens.  
The steps that follow from this point are exactly the same as if a syntax error were detected and 
<tt>p_error()</tt> were called.

<P>
One important aspect of manually setting an error is that the <tt>p_error()</tt> function will <b>NOT</b> be
called in this case.   If you need to issue an error message, make sure you do it in the production that
raises <tt>SyntaxError</tt>.

<P>
Note: This feature of PLY is meant to mimic the behavior of the YYERROR macro in yacc.

<H4><a name="ply_nn38"></a>6.8.4 When Do Syntax Errors Get Reported</H4>


<p>
In most cases, yacc will handle errors as soon as a bad input token is
detected on the input.  However, be aware that yacc may choose to
delay error handling until after it has reduced one or more grammar
rules first.  This behavior might be unexpected, but it's related to
special states in the underlying parsing table known as "defaulted
states."  A defaulted state is parsing condition where the same
grammar rule will be reduced regardless of what <em>valid</em> token
comes next on the input.  For such states, yacc chooses to go ahead
and reduce the grammar rule <em>without reading the next input
token</em>.  If the next token is bad, yacc will eventually get around to reading it and 
report a syntax error.  It's just a little unusual in that you might
see some of your grammar rules firing immediately prior to the syntax 
error.
</p>

<p>
Usually, the delayed error reporting with defaulted states is harmless
(and there are other reasons for wanting PLY to behave in this way).
However, if you need to turn this behavior off for some reason.  You
can clear the defaulted states table like this:
</p>

<blockquote>
<pre>
parser = yacc.yacc()
parser.defaulted_states = {}
</pre>
</blockquote>

<p>
Disabling defaulted states is not recommended if your grammar makes use
of embedded actions as described in Section 6.11.</p>

<H4><a name="ply_nn32"></a>6.8.5 General comments on error handling</H4>


For normal types of languages, error recovery with error rules and resynchronization characters is probably the most reliable
technique. This is because you can instrument the grammar to catch errors at selected places where it is relatively easy 
to recover and continue parsing.  Panic mode recovery is really only useful in certain specialized applications where you might want
to discard huge portions of the input text to find a valid restart point.

<H3><a name="ply_nn33"></a>6.9 Line Number and Position Tracking</H3>


Position tracking is often a tricky problem when writing compilers.
By default, PLY tracks the line number and position of all tokens.
This information is available using the following functions:

<ul>
<li><tt>p.lineno(num)</tt>. Return the line number for symbol <em>num</em>
<li><tt>p.lexpos(num)</tt>. Return the lexing position for symbol <em>num</em>
</ul>

For example:

<blockquote>
<pre>
def p_expression(p):
    'expression : expression PLUS expression'
    line   = p.lineno(2)        # line number of the PLUS token
    index  = p.lexpos(2)        # Position of the PLUS token
</pre>
</blockquote>

As an optional feature, <tt>yacc.py</tt> can automatically track line
numbers and positions for all of the grammar symbols as well.
However, this extra tracking requires extra processing and can
significantly slow down parsing.  Therefore, it must be enabled by
passing the
<tt>tracking=True</tt> option to <tt>yacc.parse()</tt>.  For example:

<blockquote>
<pre>
yacc.parse(data,tracking=True)
</pre>
</blockquote>

Once enabled, the <tt>lineno()</tt> and <tt>lexpos()</tt> methods work
for all grammar symbols.  In addition, two additional methods can be
used:

<ul>
<li><tt>p.linespan(num)</tt>. Return a tuple (startline,endline) with the starting and ending line number for symbol <em>num</em>.
<li><tt>p.lexspan(num)</tt>. Return a tuple (start,end) with the starting and ending positions for symbol <em>num</em>.
</ul>

For example:

<blockquote>
<pre>
def p_expression(p):
    'expression : expression PLUS expression'
    p.lineno(1)        # Line number of the left expression
    p.lineno(2)        # line number of the PLUS operator
    p.lineno(3)        # line number of the right expression
    ...
    start,end = p.linespan(3)    # Start,end lines of the right expression
    starti,endi = p.lexspan(3)   # Start,end positions of right expression

</pre>
</blockquote>

Note: The <tt>lexspan()</tt> function only returns the range of values up to the start of the last grammar symbol.  

<p>
Although it may be convenient for PLY to track position information on
all grammar symbols, this is often unnecessary.  For example, if you
are merely using line number information in an error message, you can
often just key off of a specific token in the grammar rule.  For
example:

<blockquote>
<pre>
def p_bad_func(p):
    'funccall : fname LPAREN error RPAREN'
    # Line number reported from LPAREN token
    print("Bad function call at line", p.lineno(2))
</pre>
</blockquote>

<p>
Similarly, you may get better parsing performance if you only
selectively propagate line number information where it's needed using
the <tt>p.set_lineno()</tt> method.  For example:

<blockquote>
<pre>
def p_fname(p):
    'fname : ID'
    p[0] = p[1]
    p.set_lineno(0,p.lineno(1))
</pre>
</blockquote>

PLY doesn't retain line number information from rules that have already been
parsed.   If you are building an abstract syntax tree and need to have line numbers,
you should make sure that the line numbers appear in the tree itself.

<H3><a name="ply_nn34"></a>6.10 AST Construction</H3>


<tt>yacc.py</tt> provides no special functions for constructing an
abstract syntax tree.  However, such construction is easy enough to do
on your own. 

<p>A minimal way to construct a tree is to simply create and
propagate a tuple or list in each grammar rule function.   There
are many possible ways to do this, but one example would be something
like this:

<blockquote>
<pre>
def p_expression_binop(p):
    '''expression : expression PLUS expression
                  | expression MINUS expression
                  | expression TIMES expression
                  | expression DIVIDE expression'''

    p[0] = ('binary-expression',p[2],p[1],p[3])

def p_expression_group(p):
    'expression : LPAREN expression RPAREN'
    p[0] = ('group-expression',p[2])

def p_expression_number(p):
    'expression : NUMBER'
    p[0] = ('number-expression',p[1])
</pre>
</blockquote>

<p>
Another approach is to create a set of data structure for different
kinds of abstract syntax tree nodes and assign nodes to <tt>p[0]</tt>
in each rule.  For example:

<blockquote>
<pre>
class Expr: pass

class BinOp(Expr):
    def __init__(self,left,op,right):
        self.type = "binop"
        self.left = left
        self.right = right
        self.op = op

class Number(Expr):
    def __init__(self,value):
        self.type = "number"
        self.value = value

def p_expression_binop(p):
    '''expression : expression PLUS expression
                  | expression MINUS expression
                  | expression TIMES expression
                  | expression DIVIDE expression'''

    p[0] = BinOp(p[1],p[2],p[3])

def p_expression_group(p):
    'expression : LPAREN expression RPAREN'
    p[0] = p[2]

def p_expression_number(p):
    'expression : NUMBER'
    p[0] = Number(p[1])
</pre>
</blockquote>

The advantage to this approach is that it may make it easier to attach more complicated
semantics, type checking, code generation, and other features to the node classes.

<p>
To simplify tree traversal, it may make sense to pick a very generic
tree structure for your parse tree nodes.  For example:

<blockquote>
<pre>
class Node:
    def __init__(self,type,children=None,leaf=None):
         self.type = type
         if children:
              self.children = children
         else:
              self.children = [ ]
         self.leaf = leaf
	 
def p_expression_binop(p):
    '''expression : expression PLUS expression
                  | expression MINUS expression
                  | expression TIMES expression
                  | expression DIVIDE expression'''

    p[0] = Node("binop", [p[1],p[3]], p[2])
</pre>
</blockquote>

<H3><a name="ply_nn35"></a>6.11 Embedded Actions</H3>


The parsing technique used by yacc only allows actions to be executed at the end of a rule.  For example,
suppose you have a rule like this:

<blockquote>
<pre>
def p_foo(p):
    "foo : A B C D"
    print("Parsed a foo", p[1],p[2],p[3],p[4])
</pre>
</blockquote>

<p>
In this case, the supplied action code only executes after all of the
symbols <tt>A</tt>, <tt>B</tt>, <tt>C</tt>, and <tt>D</tt> have been
parsed. Sometimes, however, it is useful to execute small code
fragments during intermediate stages of parsing.  For example, suppose
you wanted to perform some action immediately after <tt>A</tt> has
been parsed. To do this, write an empty rule like this:

<blockquote>
<pre>
def p_foo(p):
    "foo : A seen_A B C D"
    print("Parsed a foo", p[1],p[3],p[4],p[5])
    print("seen_A returned", p[2])

def p_seen_A(p):
    "seen_A :"
    print("Saw an A = ", p[-1])   # Access grammar symbol to left
    p[0] = some_value            # Assign value to seen_A

</pre>
</blockquote>

<p>
In this example, the empty <tt>seen_A</tt> rule executes immediately
after <tt>A</tt> is shifted onto the parsing stack.  Within this
rule, <tt>p[-1]</tt> refers to the symbol on the stack that appears
immediately to the left of the <tt>seen_A</tt> symbol.  In this case,
it would be the value of <tt>A</tt> in the <tt>foo</tt> rule
immediately above.  Like other rules, a value can be returned from an
embedded action by simply assigning it to <tt>p[0]</tt>

<p>
The use of embedded actions can sometimes introduce extra shift/reduce conflicts.  For example,
this grammar has no conflicts:

<blockquote>
<pre>
def p_foo(p):
    """foo : abcd
           | abcx"""

def p_abcd(p):
    "abcd : A B C D"

def p_abcx(p):
    "abcx : A B C X"
</pre>
</blockquote>

However, if you insert an embedded action into one of the rules like this,

<blockquote>
<pre>
def p_foo(p):
    """foo : abcd
           | abcx"""

def p_abcd(p):
    "abcd : A B C D"

def p_abcx(p):
    "abcx : A B seen_AB C X"

def p_seen_AB(p):
    "seen_AB :"
</pre>
</blockquote>

an extra shift-reduce conflict will be introduced.  This conflict is
caused by the fact that the same symbol <tt>C</tt> appears next in
both the <tt>abcd</tt> and <tt>abcx</tt> rules.  The parser can either
shift the symbol (<tt>abcd</tt> rule) or reduce the empty
rule <tt>seen_AB</tt> (<tt>abcx</tt> rule).

<p>
A common use of embedded rules is to control other aspects of parsing
such as scoping of local variables.  For example, if you were parsing C code, you might
write code like this:

<blockquote>
<pre>
def p_statements_block(p):
    "statements: LBRACE new_scope statements RBRACE"""
    # Action code
    ...
    pop_scope()        # Return to previous scope

def p_new_scope(p):
    "new_scope :"
    # Create a new scope for local variables
    s = new_scope()
    push_scope(s)
    ...
</pre>
</blockquote>

In this case, the embedded action <tt>new_scope</tt> executes
immediately after a <tt>LBRACE</tt> (<tt>{</tt>) symbol is parsed.
This might adjust internal symbol tables and other aspects of the
parser.  Upon completion of the rule <tt>statements_block</tt>, code
might undo the operations performed in the embedded action
(e.g., <tt>pop_scope()</tt>).

<H3><a name="ply_nn36"></a>6.12 Miscellaneous Yacc Notes</H3>


<ul>

<li>By default, <tt>yacc.py</tt> relies on <tt>lex.py</tt> for tokenizing.  However, an alternative tokenizer
can be supplied as follows:

<blockquote>
<pre>
parser = yacc.parse(lexer=x)
</pre>
</blockquote>
in this case, <tt>x</tt> must be a Lexer object that minimally has a <tt>x.token()</tt> method for retrieving the next
token.   If an input string is given to <tt>yacc.parse()</tt>, the lexer must also have an <tt>x.input()</tt> method.

<p>
<li>By default, the yacc generates tables in debugging mode (which produces the parser.out file and other output).
To disable this, use

<blockquote>
<pre>
parser = yacc.yacc(debug=False)
</pre>
</blockquote>

<p>
<li>To change the name of the <tt>parsetab.py</tt> file,  use:

<blockquote>
<pre>
parser = yacc.yacc(tabmodule="foo")
</pre>
</blockquote>

<P>
Normally, the <tt>parsetab.py</tt> file is placed into the same directory as
the module where the parser is defined. If you want it to go somewhere else, you can
given an absolute package name for <tt>tabmodule</tt> instead.  In that case, the 
tables will be written there.
</p>

<p>
<li>To change the directory in which the <tt>parsetab.py</tt> file (and other output files) are written, use:
<blockquote>
<pre>
parser = yacc.yacc(tabmodule="foo",outputdir="somedirectory")
</pre>
</blockquote>

<p>
Note: Be aware that unless the directory specified is also on Python's path (<tt>sys.path</tt>), subsequent
imports of the table file will fail.   As a general rule, it's better to specify a destination using the
<tt>tabmodule</tt> argument instead of directly specifying a directory using the <tt>outputdir</tt> argument.
</p>

<p>
<li>To prevent yacc from generating any kind of parser table file, use:
<blockquote>
<pre>
parser = yacc.yacc(write_tables=False)
</pre>
</blockquote>

Note: If you disable table generation, yacc() will regenerate the parsing tables
each time it runs (which may take awhile depending on how large your grammar is).

<P>
<li>To print copious amounts of debugging during parsing, use:

<blockquote>
<pre>
parser.parse(input_text, debug=True)     
</pre>
</blockquote>

<p>
<li>Since the generation of the LALR tables is relatively expensive, previously generated tables are
cached and reused if possible.  The decision to regenerate the tables is determined by taking an MD5
checksum of all grammar rules and precedence rules.  Only in the event of a mismatch are the tables regenerated.

<p>
It should be noted that table generation is reasonably efficient, even for grammars that involve around a 100 rules
and several hundred states. </li>


<p>
<li>Since LR parsing is driven by tables, the performance of the parser is largely independent of the
size of the grammar.   The biggest bottlenecks will be the lexer and the complexity of the code in your grammar rules.
</li>
</p>

<p>
<li><tt>yacc()</tt> also allows parsers to be defined as classes and as closures (see the section on alternative specification of
lexers).  However, be aware that only one parser may be defined in a single module (source file).  There are various 
error checks and validation steps that may issue confusing error messages if you try to define multiple parsers
in the same source file.
</li>
</p>

<p>
<li>Decorators of production rules have to update the wrapped function's line number.  <tt>wrapper.co_firstlineno = func.__code__.co_firstlineno</tt>:

<blockquote>
<pre>
from functools import wraps
from nodes import Collection


def strict(*types):
    def decorate(func):
        @wraps(func)
        def wrapper(p):
            func(p)
            if not isinstance(p[0], types):
                raise TypeError

        wrapper.co_firstlineno = func.__code__.co_firstlineno
        return wrapper

    return decorate

@strict(Collection)
def p_collection(p):
    """
    collection  : sequence
                | map
    """
    p[0] = p[1]
</pre>
</blockquote>

</li>
</p>


</ul>
</p>


<H2><a name="ply_nn37"></a>7. Multiple Parsers and Lexers</H2>


In advanced parsing applications, you may want to have multiple
parsers and lexers. 

<p>
As a general rules this isn't a problem.   However, to make it work,
you need to carefully make sure everything gets hooked up correctly.
First, make sure you save the objects returned by <tt>lex()</tt> and
<tt>yacc()</tt>.  For example:

<blockquote>
<pre>
lexer  = lex.lex()       # Return lexer object
parser = yacc.yacc()     # Return parser object
</pre>
</blockquote>

Next, when parsing, make sure you give the <tt>parse()</tt> function a reference to the lexer it
should be using.  For example:

<blockquote>
<pre>
parser.parse(text,lexer=lexer)
</pre>
</blockquote>

If you forget to do this, the parser will use the last lexer
created--which is not always what you want.

<p>
Within lexer and parser rule functions, these objects are also
available.  In the lexer, the "lexer" attribute of a token refers to
the lexer object that triggered the rule. For example:

<blockquote>
<pre>
def t_NUMBER(t):
   r'\d+'
   ...
   print(t.lexer)           # Show lexer object
</pre>
</blockquote>

In the parser, the "lexer" and "parser" attributes refer to the lexer
and parser objects respectively.

<blockquote>
<pre>
def p_expr_plus(p):
   'expr : expr PLUS expr'
   ...
   print(p.parser)          # Show parser object
   print(p.lexer)           # Show lexer object
</pre>
</blockquote>

If necessary, arbitrary attributes can be attached to the lexer or parser object.
For example, if you wanted to have different parsing modes, you could attach a mode
attribute to the parser object and look at it later.

<H2><a name="ply_nn38"></a>8. Using Python's Optimized Mode</H2>


Because PLY uses information from doc-strings, parsing and lexing
information must be gathered while running the Python interpreter in
normal mode (i.e., not with the -O or -OO options).  However, if you
specify optimized mode like this:

<blockquote>
<pre>
lex.lex(optimize=1)
yacc.yacc(optimize=1)
</pre>
</blockquote>

then PLY can later be used when Python runs in optimized mode. To make this work,
make sure you first run Python in normal mode.  Once the lexing and parsing tables
have been generated the first time, run Python in optimized mode. PLY will use
the tables without the need for doc strings.

<p>
Beware: running PLY in optimized mode disables a lot of error
checking.  You should only do this when your project has stabilized
and you don't need to do any debugging.   One of the purposes of
optimized mode is to substantially decrease the startup time of
your compiler (by assuming that everything is already properly
specified and works).

<H2><a name="ply_nn44"></a>9. Advanced Debugging</H2>


<p>
Debugging a compiler is typically not an easy task. PLY provides some
advanced diagostic capabilities through the use of Python's
<tt>logging</tt> module.   The next two sections describe this:

<H3><a name="ply_nn45"></a>9.1 Debugging the lex() and yacc() commands</H3>


<p>
Both the <tt>lex()</tt> and <tt>yacc()</tt> commands have a debugging
mode that can be enabled using the <tt>debug</tt> flag.  For example:

<blockquote>
<pre>
lex.lex(debug=True)
yacc.yacc(debug=True)
</pre>
</blockquote>

Normally, the output produced by debugging is routed to either
standard error or, in the case of <tt>yacc()</tt>, to a file
<tt>parser.out</tt>.  This output can be more carefully controlled
by supplying a logging object.  Here is an example that adds
information about where different debugging messages are coming from:

<blockquote>
<pre>
# Set up a logging object
import logging
logging.basicConfig(
    level = logging.DEBUG,
    filename = "parselog.txt",
    filemode = "w",
    format = "%(filename)10s:%(lineno)4d:%(message)s"
)
log = logging.getLogger()

lex.lex(debug=True,debuglog=log)
yacc.yacc(debug=True,debuglog=log)
</pre>
</blockquote>

If you supply a custom logger, the amount of debugging
information produced can be controlled by setting the logging level.
Typically, debugging messages are either issued at the <tt>DEBUG</tt>,
<tt>INFO</tt>, or <tt>WARNING</tt> levels.

<p>
PLY's error messages and warnings are also produced using the logging
interface.  This can be controlled by passing a logging object
using the <tt>errorlog</tt> parameter.

<blockquote>
<pre>
lex.lex(errorlog=log)
yacc.yacc(errorlog=log)
</pre>
</blockquote>

If you want to completely silence warnings, you can either pass in a
logging object with an appropriate filter level or use the <tt>NullLogger</tt>
object defined in either <tt>lex</tt> or <tt>yacc</tt>.  For example:

<blockquote>
<pre>
yacc.yacc(errorlog=yacc.NullLogger())
</pre>
</blockquote>

<H3><a name="ply_nn46"></a>9.2 Run-time Debugging</H3>


<p>
To enable run-time debugging of a parser, use the <tt>debug</tt> option to parse. This
option can either be an integer (which simply turns debugging on or off) or an instance
of a logger object. For example:

<blockquote>
<pre>
log = logging.getLogger()
parser.parse(input,debug=log)
</pre>
</blockquote>

If a logging object is passed, you can use its filtering level to control how much
output gets generated.   The <tt>INFO</tt> level is used to produce information
about rule reductions.  The <tt>DEBUG</tt> level will show information about the
parsing stack, token shifts, and other details.  The <tt>ERROR</tt> level shows information
related to parsing errors.

<p>
For very complicated problems, you should pass in a logging object that
redirects to a file where you can more easily inspect the output after
execution.

<H2><a name="ply_nn49"></a>10. Packaging Advice</H2>


<p>
If you are distributing a package that makes use of PLY, you should
spend a few moments thinking about how you want to handle the files
that are automatically generated.  For example, the <tt>parsetab.py</tt>
file generated by the <tt>yacc()</tt> function.</p>

<p>
Starting in PLY-3.6, the table files are created in the same directory
as the file where a parser is defined.   This means that the
<tt>parsetab.py</tt> file will live side-by-side with your parser
specification.  In terms of packaging, this is probably the easiest and
most sane approach to manage.  You don't need to give <tt>yacc()</tt>
any extra arguments and it should just "work."</p>

<p>
One concern is the management of the <tt>parsetab.py</tt> file itself.
For example, should you have this file checked into version control (e.g., GitHub),
should it be included in a package distribution as a normal file, or should you
just let PLY generate it automatically for the user when they install your package?
</p>

<p>
As of PLY-3.6, the <tt>parsetab.py</tt> file should be compatible across all versions
of Python including Python 2 and 3.  Thus, a table file generated in Python 2 should
work fine if it's used on Python 3.  Because of this, it should be relatively harmless 
to distribute the <tt>parsetab.py</tt> file yourself if you need to. However, be aware
that older/newer versions of PLY may try to regenerate the file if there are future 
enhancements or changes to its format.
</p>

<p>
To make the generation of table files easier for the purposes of installation, you might
way to make your parser files executable using the <tt>-m</tt> option or similar.  For
example:
</p>

<blockquote>
<pre>
# calc.py
...
...
def make_parser():
    parser = yacc.yacc()
    return parser

if __name__ == '__main__':
    make_parser()
</pre>
</blockquote>

<p>
You can then use a command such as <tt>python -m calc.py</tt> to generate the tables. Alternatively,
a <tt>setup.py</tt> script, can import the module and use <tt>make_parser()</tt> to create the
parsing tables.
</p>

<p>
If you're willing to sacrifice a little startup time, you can also instruct PLY to never write the
tables using <tt>yacc.yacc(write_tables=False, debug=False)</tt>.   In this mode, PLY will regenerate
the parsing tables from scratch each time.  For a small grammar, you probably won't notice.  For a 
large grammar, you should probably reconsider--the parsing tables are meant to dramatically speed up this process.
</p>

<p>
During operation, is is normal for PLY to produce diagnostic error
messages (usually printed to standard error).  These are generated
entirely using the <tt>logging</tt> module.  If you want to redirect
these messages or silence them, you can provide your own logging
object to <tt>yacc()</tt>.  For example:
</p>

<blockquote>
<pre>
import logging
log = logging.getLogger('ply')
...
parser = yacc.yacc(errorlog=log)
</pre>
</blockquote>

<H2><a name="ply_nn39"></a>11. Where to go from here?</H2>


The <tt>examples</tt> directory of the PLY distribution contains several simple examples.   Please consult a
compilers textbook for the theory and underlying implementation details or LR parsing.

</body>
</html>







