1个稳定版本

1.0.0 2023年3月3日

#77#忽略


langen 中使用

MIT 许可证

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