------------------------------
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 Fran�ois 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 Fran�ois 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)