1 个稳定版本
1.0.0 | 2023年3月3日 |
---|
#751 在 编程语言
6KB
67 行
Langen
创建编程语言的工具
请安装 langen
而不是 langen_macro
以确保该工具正确运行!
大部分工作在编译期间完成,因此它应该运行得相当快
用法
use langen;
#[derive(Debug, PartialEq)]
#[derive(langen::Langen)]
enum Tokens {
#[token(r"[ \t\r]", ignore=true)]
_Ignore,
#[token(r"let")]
Let,
#[token(r"=")]
Assign,
#[token(r";")]
Semicolon,
#[token(r"[0-9]+")]
#[token(r"0x[0-9A-F]+")]
IntLiteral,
#[token(r"[A-Za-z_]+")]
Identifier,
}
fn main() {
let tokens = Tokens::scan("let variable = 312;").unwrap();
let mut iter = tokens.iter();
assert_eq!(iter.next(), Some(&Tokens::Let));
assert_eq!(iter.next(), Some(&Tokens::Identifier));
assert_eq!(iter.next(), Some(&Tokens::Assign));
assert_eq!(iter.next(), Some(&Tokens::IntLiteral));
assert_eq!(iter.next(), Some(&Tokens::Semicolon));
assert_eq!(iter.next(), None);
}
要使用 langen,请在枚举上派生 langen::Langen
。要定义一个词法单元,请向其中添加 #[token()]
。词法单元内的第一个参数始终是正则表达式。首先定义的词法单元将具有优先级(例如,Let
的优先级高于 Identifier
,尽管它们匹配相同的输入)。您还可以为枚举的一个变体定义多个词法单元,使它们都产生该变体。您可以选择添加 ignore=true
,这样词法单元不会向输出添加任何内容。您可以通过在枚举上调用 scan(input)
来获取解析后的词法单元。
功能
- 词法分析器
计划的功能
- 解析器
- AST生成
许可证
本项目受MIT许可证许可
依赖
~3MB
~85K SLoC