2个版本

0.1.1 2020年8月11日
0.1.0 2020年8月11日

#318 in 解析工具


2 crate 中使用

MIT 许可证

45KB
1K SLoC

Sana

Rust crates.io docs.rs

Sana是Rust的词法分析器生成器。它提供了一种简单的方法来创建一种语言的词法分析器。

与其他词法分析器生成器不同,Sana支持扩展的正则表达式,这使得您能够更清晰地表达意图。例如,您可以使用以下代码表示不包含 -- 的标点符号序列:"[[:punct:]]+" & !".*--.*"

在编译时,Sana

  • 从令牌定义构建确定状态自动机
  • 从自动机生成中间表示(IR)
  • 将IR编译成Rust代码

有关Sana架构的概述,请参阅DESIGN.md

示例

use sana::{Sana, Spanned};

#[derive(Debug, Clone, Copy, PartialEq, Sana)]
#[backend(rust)] // optional. can be either rust or vm. default is rust
enum Token {
    #[regex("[a-zA-Z_][a-zA-Z0-9_]*")]
    Ident,
    #[regex("[0-9]+")]
    Integer,

    #[token("let", priority = 1)]
    Let,
    #[token("=")]
    Equals,
    #[regex(";")]
    Semicolon,

    #[regex("[ \t\r\n]")]
    Whitespace,
    #[error]
    Error,
}

fn main() {
    let mut lexer = Token::lexer("let answer = 42;");

    assert_eq!(
        lexer.next(),
        Some(Spanned { value: Token::Let, start: 0, end: 3 })
    );
    assert_eq!(lexer.next(),
        Some(Spanned { value: Token::Whitespace, start: 3, end: 4 })
    );
    assert_eq!(lexer.next(),
        Some(Spanned { value: Token::Ident, start: 4, end: 10 })
    );
    assert_eq!(lexer.next(),
        Some(Spanned { value: Token::Whitespace, start: 10, end: 11 })
    );
    assert_eq!(
        lexer.next(),
        Some(Spanned { value: Token::Equals, start: 11, end: 12 })
    );
    assert_eq!(
        lexer.next(),
        Some(Spanned { value: Token::Whitespace, start: 12, end: 13 })
    );
    assert_eq!(
        lexer.next(),
        Some(Spanned { value: Token::Integer, start: 13, end: 15 })
    );
    assert_eq!(
        lexer.next(),
        Some(Spanned { value: Token::Semicolon, start: 15, end: 16 })
    );

    // No tokens left
    assert_eq!(
        lexer.next(),
        None
    );
}

您可以在examples目录中找到更多示例。

依赖关系

~1.5MB
~50K SLoC