1 个不稳定版本
0.1.1 | 2022 年 1 月 24 日 |
---|
466 在 编程语言 中
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