Source

ply / CHANGES

The default branch has multiple heads

Version 2.0
------------------------------
09/07/06: beazley
          Major cleanup and refactoring of the LR table generation code.  Both SLR
          and LALR(1) table generation is now performed by the same code base with
          only minor extensions for extra LALR(1) processing.

09/07/06: beazley
          Completely reimplemented the entire LALR(1) parsing engine to use the
          DeRemer and Pennello algorithm for calculating lookahead sets.  This
          significantly improves the performance of generating LALR(1) tables
          and has the added feature of actually working correctly!  If you
          experienced weird behavior with LALR(1) in prior releases, this should
          hopefully resolve all of those problems.  Many thanks to 
          Andrew Waters and Markus Schoepflin for submitting bug reports
          and helping me test out the revised LALR(1) support.

Version 1.8
------------------------------
08/02/06: beazley
          Fixed a problem related to the handling of default actions in LALR(1)
          parsing.  If you experienced subtle and/or bizarre behavior when trying
          to use the LALR(1) engine, this may correct those problems.  Patch
          contributed by Russ Cox.  Note: This patch has been superceded by 
          revisions for LALR(1) parsing in Ply-2.0.

08/02/06: beazley
          Added support for slicing of productions in yacc.  
          Patch contributed by Patrick Mezard.

Version 1.7
------------------------------
03/02/06: beazley
          Fixed infinite recursion problem ReduceToTerminals() function that
          would sometimes come up in LALR(1) table generation.  Reported by 
          Markus Schoepflin.

03/01/06: beazley
          Added "reflags" argument to lex().  For example:

               lex.lex(reflags=re.UNICODE)

          This can be used to specify optional flags to the re.compile() function
          used inside the lexer.   This may be necessary for special situations such
          as processing Unicode (e.g., if you want escapes like \w and \b to consult
          the Unicode character property database).   The need for this suggested by
          Andreas Jung.

03/01/06: beazley
          Fixed a bug with an uninitialized variable on repeated instantiations of parser
          objects when the write_tables=0 argument was used.   Reported by Michael Brown.

03/01/06: beazley
          Modified lex.py to accept Unicode strings both as the regular expressions for
          tokens and as input. Hopefully this is the only change needed for Unicode support.
          Patch contributed by Johan Dahl.

03/01/06: beazley
          Modified the class-based interface to work with new-style or old-style classes.
          Patch contributed by Michael Brown (although I tweaked it slightly so it would work
          with older versions of Python).

Version 1.6
------------------------------
05/27/05: beazley
          Incorporated patch contributed by Christopher Stawarz to fix an extremely
          devious bug in LALR(1) parser generation.   This patch should fix problems
          numerous people reported with LALR parsing.

05/27/05: beazley
          Fixed problem with lex.py copy constructor.  Reported by Dave Aitel, Aaron Lav,
          and Thad Austin. 

05/27/05: beazley
          Added outputdir option to yacc()  to control output directory. Contributed
          by Christopher Stawarz.

05/27/05: beazley
          Added rununit.py test script to run tests using the Python unittest module.
          Contributed by Miki Tebeka.

Version 1.5
------------------------------
05/26/04: beazley
          Major enhancement. LALR(1) parsing support is now working.
          This feature was implemented by Elias Ioup (ezioup@alumni.uchicago.edu)
          and optimized by David Beazley. To use LALR(1) parsing do
          the following:

               yacc.yacc(method="LALR")

          Computing LALR(1) parsing tables takes about twice as long as
          the default SLR method.  However, LALR(1) allows you to handle
          more complex grammars.  For example, the ANSI C grammar
          (in example/ansic) has 13 shift-reduce conflicts with SLR, but
          only has 1 shift-reduce conflict with LALR(1).

05/20/04: beazley
          Added a __len__ method to parser production lists.  Can
          be used in parser rules like this:

             def p_somerule(p):
                 """a : B C D
                      | E F"
                 if (len(p) == 3):
                     # Must have been first rule
                 elif (len(p) == 2):
                     # Must be second rule

          Suggested by Joshua Gerth and others.

Version 1.4
------------------------------
04/23/04: beazley
          Incorporated a variety of patches contributed by Eric Raymond.
          These include:

           0. Cleans up some comments so they don't wrap on an 80-column display.
           1. Directs compiler errors to stderr where they belong.
           2. Implements and documents automatic line counting when \n is ignored.
           3. Changes the way progress messages are dumped when debugging is on. 
              The new format is both less verbose and conveys more information than
              the old, including shift and reduce actions.

04/23/04: beazley
          Added a Python setup.py file to simply installation.  Contributed
          by Adam Kerrison.

04/23/04: beazley
          Added patches contributed by Adam Kerrison.
 
          -   Some output is now only shown when debugging is enabled.  This
              means that PLY will be completely silent when not in debugging mode.
          
          -   An optional parameter "write_tables" can be passed to yacc() to
              control whether or not parsing tables are written.   By default,
              it is true, but it can be turned off if you don't want the yacc
              table file. Note: disabling this will cause yacc() to regenerate
              the parsing table each time.

04/23/04: beazley
          Added patches contributed by David McNab.  This patch addes two
          features:

          -   The parser can be supplied as a class instead of a module.
              For an example of this, see the example/classcalc directory.

          -   Debugging output can be directed to a filename of the user's
              choice.  Use

                 yacc(debugfile="somefile.out")

          
Version 1.3
------------------------------
12/10/02: jmdyck
          Various minor adjustments to the code that Dave checked in today.
          Updated test/yacc_{inf,unused}.exp to reflect today's changes.

12/10/02: beazley
          Incorporated a variety of minor bug fixes to empty production
          handling and infinite recursion checking.  Contributed by
          Michael Dyck.

12/10/02: beazley
          Removed bogus recover() method call in yacc.restart()

Version 1.2
------------------------------
11/27/02: beazley
          Lexer and parser objects are now available as an attribute
          of tokens and slices respectively. For example:
 
             def t_NUMBER(t):
                 r'\d+'
                 print t.lexer

             def p_expr_plus(t):
                 'expr: expr PLUS expr'
                 print t.lexer
                 print t.parser

          This can be used for state management (if needed).
 
10/31/02: beazley
          Modified yacc.py to work with Python optimize mode.  To make
          this work, you need to use

              yacc.yacc(optimize=1)

          Furthermore, you need to first run Python in normal mode
          to generate the necessary parsetab.py files.  After that,
          you can use python -O or python -OO.  

          Note: optimized mode turns off a lot of error checking.
          Only use when you are sure that your grammar is working.
          Make sure parsetab.py is up to date!

10/30/02: beazley
          Added cloning of Lexer objects.   For example:

              import copy
              l = lex.lex()
              lc = copy.copy(l)

              l.input("Some text")
              lc.input("Some other text")
              ...

          This might be useful if the same "lexer" is meant to
          be used in different contexts---or if multiple lexers
          are running concurrently.
                
10/30/02: beazley
          Fixed subtle bug with first set computation and empty productions.
          Patch submitted by Michael Dyck.

10/30/02: beazley
          Fixed error messages to use "filename:line: message" instead
          of "filename:line. message".  This makes error reporting more
          friendly to emacs. Patch submitted by Franois Pinard.

10/30/02: beazley
          Improvements to parser.out file.  Terminals and nonterminals
          are sorted instead of being printed in random order.
          Patch submitted by Franois Pinard.

10/30/02: beazley
          Improvements to parser.out file output.  Rules are now printed
          in a way that's easier to understand.  Contributed by Russ Cox.

10/30/02: beazley
          Added 'nonassoc' associativity support.    This can be used
          to disable the chaining of operators like a < b < c.
          To use, simply specify 'nonassoc' in the precedence table

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

          Patch contributed by Russ Cox.

10/30/02: beazley
          Modified the lexer to provide optional support for Python -O and -OO
          modes.  To make this work, Python *first* needs to be run in
          unoptimized mode.  This reads the lexing information and creates a
          file "lextab.py".  Then, run lex like this:

                   # module foo.py
                   ...
                   ...
                   lex.lex(optimize=1)

          Once the lextab file has been created, subsequent calls to
          lex.lex() will read data from the lextab file instead of using 
          introspection.   In optimized mode (-O, -OO) everything should
          work normally despite the loss of doc strings.

          To change the name of the file 'lextab.py' use the following:

                  lex.lex(lextab="footab")

          (this creates a file footab.py)
         

Version 1.1   October 25, 2001
------------------------------

10/25/01: beazley
          Modified the table generator to produce much more compact data.
          This should greatly reduce the size of the parsetab.py[c] file.
          Caveat: the tables still need to be constructed so a little more
          work is done in parsetab on import. 

10/25/01: beazley
          There may be a possible bug in the cycle detector that reports errors
          about infinite recursion.   I'm having a little trouble tracking it
          down, but if you get this problem, you can disable the cycle
          detector as follows:

                 yacc.yacc(check_recursion = 0)

10/25/01: beazley
          Fixed a bug in lex.py that sometimes caused illegal characters to be
          reported incorrectly.  Reported by Sverre Jrgensen.

7/8/01  : beazley
          Added a reference to the underlying lexer object when tokens are handled by
          functions.   The lexer is available as the 'lexer' attribute.   This
          was added to provide better lexing support for languages such as Fortran
          where certain types of tokens can't be conveniently expressed as regular 
          expressions (and where the tokenizing function may want to perform a 
          little backtracking).  Suggested by Pearu Peterson.

6/20/01 : beazley
          Modified yacc() function so that an optional starting symbol can be specified.
          For example:
            
                 yacc.yacc(start="statement")

          Normally yacc always treats the first production rule as the starting symbol.
          However, if you are debugging your grammar it may be useful to specify
          an alternative starting symbol.  Idea suggested by Rich Salz.
                      
Version 1.0  June 18, 2001
--------------------------
Initial public offering
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.