1 个稳定版本

1.0.0 2023年3月3日

#751编程语言

MIT 协议

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