30 releases
0.13.1 | Jan 27, 2023 |
---|---|
0.12.0 | Apr 14, 2022 |
0.11.1 | Dec 7, 2021 |
0.11.0 | Nov 18, 2021 |
0.1.1 | Dec 18, 2018 |
#137 in Parser tooling
3,447 downloads per month
Used in 3 crates
490KB
11K
SLoC
lrlex
lrlex
is a partial replacement for
lex
/
flex
. It takes an input string and
splits it into lexemes based on a .l
file. Unfortunately, many real-world
languages have corner cases which exceed the power that lrlex
can provide.
However, when it is suitable, it is a very convenient way of expressing lexing.
lrlex
also has a simple command-line interface, allowing you to check whether
your lexing rules are working as expected:
$ cat C.java
class C {
int x = 0;
}
$ cargo run --lrlex java.l /tmp/C.java
Finished dev [unoptimized + debuginfo] target(s) in 0.18s
Running `target/debug/lrlex ../grammars/java7/java.l /tmp/C.java`
CLASS class
IDENTIFIER C
LBRACE {
INT int
IDENTIFIER x
EQ =
INTEGER_LITERAL 0
SEMICOLON ;
RBRACE }
lib.rs
:
lrlex
is a partial replacement for lex
/ flex
. It takes in a .l
file and statically
compiles it to Rust code. The resulting [LRNonStreamingLexerDef] can then be given an input
string, from which it instantiates an [LRNonStreamingLexer]. This provides an iterator which
can produce the sequence of [lrpar::Lexeme]s for that input, as well as answer basic queries
about [cfgrammar::Span]s (e.g. extracting substrings, calculating line and column numbers).
Dependencies
~3.5–9MB
~173K SLoC