37 releases

new 0.13.8 Nov 7, 2024
0.13.7 Jun 14, 2024
0.13.6 May 30, 2024
0.13.4 Jan 4, 2024
0.1.1 Dec 18, 2018

#26 in Parser tooling

Download history 1755/week @ 2024-07-18 1713/week @ 2024-07-25 2039/week @ 2024-08-01 1928/week @ 2024-08-08 1339/week @ 2024-08-15 2183/week @ 2024-08-22 1631/week @ 2024-08-29 1255/week @ 2024-09-05 1241/week @ 2024-09-12 1503/week @ 2024-09-19 1464/week @ 2024-09-26 1289/week @ 2024-10-03 1810/week @ 2024-10-10 1990/week @ 2024-10-17 2170/week @ 2024-10-24 1624/week @ 2024-10-31

7,820 downloads per month
Used in 10 crates (8 directly)

Apache-2.0/MIT

505KB
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::Lexemes for that input, as well as answer basic queries about cfgrammar::Spans (e.g. extracting substrings, calculating line and column numbers).

Dependencies

~5–14MB
~162K SLoC