1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#![warn(clippy::all)]

pub mod data;
mod pipeline;

mod parser;

#[cfg(test)]
mod tests;

#[cfg(test)]
mod test_utils;

pub use data::*;

use pipeline::prelude::*;

pub fn generate(src: &str) -> Result<RustSrc, KikiErr> {
    let tokens = tokenize(src)?;
    let cst = parse(tokens)
        .map_err(|unexpected| unexpected_token_or_eof_to_kiki_err(unexpected.as_ref(), src))?;
    let ast: data::ast::File = cst.into();
    let validated = validate_ast(ast)?;
    let machine = validated_ast_to_machine(&validated);
    let table = machine_to_table(&machine, &validated)?;
    Ok(table_to_rust(&table, &validated, src))
}

pub fn get_grammar_hash(src: RustSrcRef) -> Option<&str> {
    const HASH_PREFIX: &str = "// @sha256 ";
    for line in src.0.lines() {
        if !line.starts_with("//") {
            return None;
        }

        if line.starts_with(HASH_PREFIX) {
            let hash = line.trim_start_matches(HASH_PREFIX);
            return Some(hash);
        }
    }
    None
}