1个稳定版本
1.0.0 | 2023年3月3日 |
---|
#77 在 #忽略
在 langen 中使用
26KB
580 行
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
~84K SLoC