Crates.io | langen |
lib.rs | langen |
version | 2.0.0 |
source | src |
created_at | 2023-03-03 21:49:03.263065 |
updated_at | 2024-11-18 17:07:10.955539 |
description | A tool to create programming languages |
homepage | https://github.com/HalloIhr0/langen |
repository | https://github.com/HalloIhr0/langen |
max_upload_size | |
id | 800093 |
size | 8,210 |
A tool to create programming languages
Please depend on langen
instead of langen_macro
for this to work correctly!
The crate provides a set of derive macros to generate a lexer and parser. All the heavy computations are done during compilation.
Look at the docs for more information on how to use this.
use langen::{Grammar, NoErr, Span, Tokens};
#[derive(Tokens, Grammar, Debug)]
#[ignored(r"[ \t]")]
enum Math {
#[token(r"\(")]
LParen,
#[token(r"\)")]
RParen,
#[token(r"\+")]
Plus,
#[token(r"-")]
Minus,
#[token(r"\*")]
Mul,
#[token(r"/")]
Div,
#[token(r"[0-9]+", |s: &str| {s.parse()})]
IntLit(i32),
#[rule(|_span: Span, expr: i32, term: i32| Ok::<i32, NoErr>(expr+term), Expression, Plus, Term)]
#[rule(|_span: Span, expr: i32, term: i32| Ok::<i32, NoErr>(expr+term), Expression, Minus, Term)]
#[rule(|_span: Span, term: i32| Ok::<i32, NoErr>(term), Term)]
#[rule(|_span: Span, term: i32| Ok::<i32, NoErr>(-term), Minus, Factor)]
Expression(i32),
#[rule(|_span: Span, term: i32, factor: i32| Ok::<i32, NoErr>(term*factor), Term, Mul, Factor)]
#[rule(|_span: Span, term: i32, factor: i32| Ok::<i32, NoErr>(term/factor), Term, Div, Factor)]
#[rule(|_span: Span, factor: i32| Ok::<i32, NoErr>(factor), Factor)]
Term(i32),
#[rule(|_span: Span, intlit: i32| Ok::<i32, NoErr>(intlit), IntLit)]
#[rule(|_span: Span, expr: i32| Ok::<i32, NoErr>(expr), LParen, Expression, RParen)]
Factor(i32),
}
let input = "(33+5) * (-34)";
let tokens = Math::scan(input).unwrap();
for (t, s) in &tokens {
println!("{}\t{:?}", s, t);
}
let result = Math::parse(tokens).unwrap();
println!("{:?}", result);
This project is licensed under the MIT license