Lexer and parser collections.
With laps
, you can build lexers/parsers by just defining tokens/ASTs and deriving Tokenize
/Parse
trait for them.
Add laps
to your project by running cargo add
:
cargo add laps --features macros
Implement a lexer for S-expression:
```rust use laps::prelude::*;
enum TokenKind { // This token will be skipped. #[skip(r"\s+")] _Skip, /// Parentheses. #[regex(r"[()]")] Paren(char), /// Atom. #[regex(r"[^\s()]+")] Atom(String), /// End-of-file. #[eof] Eof, } ```
And the parser and ASTs (or actually CSTs):
```rust
type Token = laps::token::Token
tokenast! {
macro Token
enum Statement { Elem(Elem), End(Token![eof]), }
struct SExp(Token![lpr], Vec
enum Elem { Atom(Token![atom]), SExp(SExp), } ```
The above implementation is very close in form to the corresponding EBNF representation of the S-expression:
ebnf
Statement ::= Elem | EOF;
SExp ::= "(" {Elem} ")";
Elem ::= ATOM | SExp;
See the examples
directory, which contains the following examples:
sexp
: a S-expression parser.calc
: a simple expression calculator.json
: a simple JSON parser.clike
: interpreter for a C-like programming language.See CHANGELOG.md.
Copyright (C) 2022-2023 MaxXing. Licensed under either of Apache 2.0 or MIT at your option.