Features:
- Make semicolon after
}
in rules optional (#355)
Fixes:
- Use hash to decide whether to recompile (#369)
- Reduce the compile times of generated parse table parsers (#366)
Thanks to the following contributors for this release:
- @matklad
- @psl8
- @Marwes
Fixes:
- Don't overflow the stack in parse table debug builds (#337)
- Use the correct type for
!
in macro expanded productions (#335) - Allow lalrpop parsers to be used with include! (#338)
- Remove dependency on docopt, rustc-serialize, update itertools (#344, #345)
- Correctly anchor regex at the beginning (#358)
Thanks to the following contributors for this release:
- @Marwes
- @mbrubek
- @waywardmonkeys
- @sanxiyn
- @17cupsofcoffee
- @matklad
Features:
- The source and binary size of generated parsers has been reduced (#324, #306)
- Regex compilation as part of the generated lexer can now be cached (#318)
- The documentation is now provided as a mbbook (#298)
Bugs fixed:
- Fixed a stack overflow in debug builds of large grammars (#337)
- The error terminal now gets the correct type assigned when part of macros (#335)
- Character literals now parse correctly in the parser files (#320)
Compatibility notes:
- To let regex compilation be cached, each parser are now generated as a struct
with a
parse
method instead of just a function. To upgrade, change each parse call fromparse_X(..)
toXParser::new().parse(..)
.
Thanks to the following contributors for this release:
- @Phlosioneer
- @waywardmonkeys
- @brendanzab
- @dtkerr
- @Marwes
- @ahmedcharles
- @udoprog
Bugs fixed:
- Infinite loop in error recovery fixed (#240).
- Bad error messages if a
;
was forgotten fixed (#276). - Grammar errors were sometimes incorrectly reported as "extra tokens" (#278)
extern
blocks now allowed even when not using a custom tokenizer (#261)ParseError
now implementsDisplay
- actions can now return a grammar's type parameter's associated type (#247)
- generated files are now rebuilt when there is a new LALRPOP version (#243)
Compatibility notes:
- As part of making
ParseError
implementDisplay
, the default error type changed from()
to&'static str
, so parse errors type may change fromlalrpop_util::ParseError<..., ()>
tolalrpop_util::ParseError<..., &'static str>
.
Thanks to the following contributors for this release:
- @fitzgen
- @joerivanruth
- @pyfisch
- @nick70
- @notriddle
- @vmx
- We now support
#![..]
attributes in.lalrpop
files. - We now use lane table by default: since the lane table algorithm
automatically generates compressed tables where possible, the
#[lalr]
attribute is still accepted, but has no effect.- If you encounter problems, please report bugs! In the meantime,
though, you can use the
LALRPOP_LANE_TABLE=disabled
environment variable to change back.
- If you encounter problems, please report bugs! In the meantime,
though, you can use the
- When the
<>
string is found within{}
inside of an action, it now generates a series ofx: x
pairs for each named valuex
. This is useful for struct constants, since you can do something like:<a:Foo> <b:Bar> => MyStruct { <> }
, ifMyStruct
had two fields nameda
andb
. - We now support character literal patterns in the external tokenizer pattern syntax.
- The lalrpop executable now supports
--version
. - We are (for now, at least) testing for compatibility with Rust 1.13. This minimal supported rustc version may change in the future, however.
- Misc bug fixes.
Thanks to the following contributors for this release:
- @jchlapinski
- @minijackson
- @nikomatsakis
- @ravenexp
- @ruuda
- @wieczyk
- @withoutboats
This is a bug release for LALRPOP. First, we have two major improvements to the generated lexer:
- The lexer now generates code that uses the
regex
crate. This results in far less code than the older style, and seems to preserve performance. - The lexer now supports custom priorities for regular expression tokens,
making it possible to support case-insensitive keywords.
- See the calculator2b example for details.
Second, we have a beta release of the new lane-table based
LR-table generation. Lane tables handle the full set of LR(1)
grammars but typically reduce much smaller state tables. This
feature eliminates the need to manually mark grammars as #[LALR]
.
Lane tables are not on by default; you can enable them by setting
LALRPOP_LANE_TABLE=enabled
in your environment (use
std::env::set_var
in your build.rs
).
Finally, the lalrpop
executable now has the ability to generate
standalone reports (--report
).
Fixed bugs:
- Fix #157: We now recognize single quote (
'
) properly in our tokenizer. - Fix #179: Fix bug in recursive ascent code generation.
Thanks to the following contributors to this release:
- @ahmedcharles
- @king6cong
- @nikomatsakis
- @nixpulvis
- @wagenet
- @wieczyk
- Add the expected successor tokens to
UnrecognizedToken
errors (thanks @Marwes!). - Fix to error recovery doing a bad cast (thanks @Marwes!).
Major new feature! @Marwes added support for error recovery.
There have also been a number of other improvements:
- The
ParseError
type now implementsError
andDisplay
(thanks @Marwes!). - We no longer emit comments in generated code by default (thanks @Marwes!).
(Yanked due to minor backwards incompatibility.)
Bug fix release. Major bugs addressed:
Also, there is now a tutorial for writing custom lexers. Thanks @malleusinferni!.
Enabled a new table-driven code-generator by default. This generates less code than the older recursive-ascent-based generation scheme, but may parse less efficiently. To go back to the old scheme, annotate the grammar declaration:
#[recursive_ascent] grammar;
Also, the syntax for requesting LALR-generation has changed to use an annotation:
#[LALR] grammar;
We no longer emit module-level attributes, which means that unused imports in your .lalrpop file may start getting warnings. Thanks @dflemstr!
An overflow bug in LALRPOP was fixed. Thanks @larsluthman!
We no longer depend on time
, but now use
std::time
. Thanks @serprex!
There is now a Configuration
object for use in your build.rs
scripts. And,
thanks to @dflemstr!,
it permits you to configure the directory where LALRPOP output is
generated.
Fixed a bug in the LALRPOP option parsing. Thanks @Nemikolh!
Various typos and small corrections. Thanks @reuben and @ashleygwilliams!
Updated to use the regex-syntax
crate for regular expression
parsing instead of rolling our own parser. This means we can now
support the same regular expression syntax as the regex crate,
and in particular can support unicode character classes like \p{Greek}
.
Note that some regex features -- such as non-greedy repetition and
named capture groups -- are still not supported (or just not meaningful).
Optimized LR(1) construction time by approximately 5x.
Improved handling of location tokens @L
and @R
so that they can be
freely used without ever causing parse conflicts.
Major update to LALRPOP error messages in cases of shift/reduce and reduce/reduce conflicts. The messages now try to explain the problem in terms of your grammar, as well as diagnosing common problem scenarios and suggesting solutions.
Added a standalone LALRPOP executable.
We no longer generate incomplete files when grammar generation fails (Issue #57).
Miscellaneous bug fixes, mostly. Processing for a build.rs
file now
starts from the project directory, rather than being hardcoded to
start from src
.
Add support for inlining nonterminals. Nonterminals can now be
annotated with #[inline]
. If you do so, each use of the nonterminal
will be inlined into its place. This can be very helpful in addressing
shift-reduce or reduce-reduce conflicts, at the cost of a larger
grammar. We now inline Foo*
, Foo?
, and (Foo Bar)
nonterminals by
default.
This is mostly a bug-fix release.
Various minor issues were addressed:
- Issue #25: Unbalanced parens in string literals appearing in code now work properly.
- Issue #32: Regular expression parsing consumed infinite memory when a
.
appeared. - Issue #34: Automatic tokenizer generation did not play well with generic type parameters.
I hadn't yet started writing release notes, sorry.