#编译器 #ll #理解 #解析器 # #规则 #自动机

bin+lib llk

一个快速、易于理解的 LL(k) (目前是 LL(1)) 库和编译器编译器(即将推出)

1 个不稳定版本

0.1.1 2022 年 1 月 24 日

466编程语言

MPL-2.0 许可证

30KB
585

LL 解析器

在这里,你可以找到一个 "LL" 解析器。

目前,我已用 Rust 编写了代码。C 和 Python 即将推出。

  • 特性
    • 一个相当快、在内存和 CPU 资源方面都很高效的库
    • 简单的代码(但我认为其清晰度还可以进一步提高:如果你看到一些实现它的方法,请随时贡献!)
    • 语法树(也许其内存消耗可以进一步提高:它是代码的主要内存消耗者)
    • 规则操作
  • 待办事项
    • 添加编译器编译器用法和更详细的 API 文档
    • 修复导致大文件执行失败的错误(Rust 中的堆栈耗尽恐慌)
    • 添加 C 和 Python 代码
    • 完成编译器编译器
    • 添加 LL(k) 和 LL(*) 解析器

快速入门

用法(Rust)

快速入门

要安装,请参阅安装说明。
然后,尝试以下代码

use llk::*;

//We begin at 2 because 0 and 1 are reserved
const LEFT_PAR : u32 = 2;// (
const RIGHT_PAR : u32 = 3; // )
const a : u32 = 4; // a

//Non terminal tokens begin after terminal tokens
const A : u32 = 5;
const B : u32 = 6;

fn main() {
	let mut parser =
		LL1Parser::new(vec![
			Rule::new(vec![
				vec![LEFT_PAR, A, RIGHT_PAR],
				vec![B]
			]),//A
			Rule::new(vec![
				vec![a]
			]),//B
		],
		vec![&|stree|{println!("{}", *stree)}, &|_|{}, &|_|{}],
		A,
		A
	);
	match parser.make_table() {
		Err(msg) => {
			println!("The grammar is buggy : {}", msg); //If so, report this bug to me ;-)
			return;
		}
		Ok(()) => {}
	}
	// ((((a))))
	let l_p = Token::Terminal{id : LEFT_PAR, value : String::from("("), pos : 0};
	let r_p = Token::Terminal{id : RIGHT_PAR, value : String::from(")"), pos : 0};
	let a_ = Token::Terminal{id : a, value : String::from("a"), pos : 0};
	let mut ind = 0;
	//Here, we are using a lot of clones because it's simpler, 
	//but keep in mind that that's not a good practice
	let tokens = vec![l_p.clone(),
					  l_p.clone(),
					  l_p.clone(),
					  l_p.clone(),
					  a_.clone(),
					  r_p.clone(),
					  r_p.clone(),
					  r_p.clone(),
					  r_p.clone(),
					  default_token::T_EOF.clone()
					];
	match parser.analyse_tokens(
		|| {
			if ind < tokens.len() {
				ind += 1;
				return Some(tokens[ind - 1].clone());
			}
			return None;
		}
	){
		Err(msg) => {
			println!("Syntax error : {:?}", msg); //If so, report this bug to me ;-)
			return;
		}
		Ok((stree, warnings)) => {
			println!("{}", stree);
			println!("{}", warnings);
		}
	}
	println!("Parsing succeeded !");
}

安装

要将它作为依赖项安装,只需将以下行添加到你的 Cargo.toml 文件中

[dependencies]
llk = "0.1.1"

如果你想要本地安装,请执行以下操作

git clone https://github.com/Dalejosne/Automata

并且所有需要的文件都将位于 Automata/game_of_life 子目录中。

文档

安装后,执行

cargo doc

然后打开 target/doc/game_of_life 目录中的 index.html 文件

示例

请参阅 "examples" 仓库。要运行它们,执行

cargo run --example basic

无运行时依赖