106 lines
1.8 KiB
Markdown
106 lines
1.8 KiB
Markdown
# Aster
|
||
|
||
用 Rust 实现的脚本语言解释器。
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
aster/
|
||
├── src/
|
||
│ ├── lexer/ # 词法分析器
|
||
│ ├── ast/ # 抽象语法树
|
||
│ ├── parser/ # 语法分析器
|
||
│ ├── interpreter/# 解释器
|
||
│ ├── error/ # 错误处理
|
||
│ └── main.rs
|
||
├── script.ast # 示例脚本
|
||
└── Cargo.toml
|
||
```
|
||
|
||
## 运行方式
|
||
|
||
```bash
|
||
# 运行脚本文件
|
||
cargo run -- script.ast
|
||
|
||
# 从标准输入读取
|
||
cargo run
|
||
```
|
||
|
||
## 语言特性
|
||
|
||
### 数据类型
|
||
|
||
- 数字(`Number`)
|
||
- 字符串(`String`)
|
||
- 布尔值(`true` / `false`)
|
||
- 空值(`nil`)
|
||
- 对象(`Object`)——以字典形式保存键值对
|
||
|
||
### 变量与赋值
|
||
|
||
```rust
|
||
let x = 42;
|
||
let name = "aster";
|
||
```
|
||
|
||
### 控制流
|
||
|
||
- **条件分支**:`if` / `else`
|
||
- **循环**:`while`
|
||
|
||
### 函数
|
||
|
||
```rust
|
||
fn fib(n) {
|
||
if (n <= 1) {
|
||
return n
|
||
}
|
||
return fib(n - 1) + fib(n - 2)
|
||
}
|
||
|
||
print(fib(10))
|
||
```
|
||
|
||
### 运算符
|
||
|
||
- 算术:`+` `-` `*` `/`
|
||
- 比较:`<` `<=` `>` `>=` `==` `!=`
|
||
- 逻辑:`&&` `||`
|
||
- 一元:`!` `-`
|
||
|
||
### 对象与属性
|
||
|
||
使用花括号即可声明对象字面量,并通过 `.` 访问或更新属性:
|
||
|
||
```rust
|
||
let user = { name: "aster", version: 1 };
|
||
print(user.name);
|
||
user.version = user.version + 1;
|
||
print(user.version);
|
||
```
|
||
|
||
对象可以嵌套,也可以与命名空间组合使用(例如 `io.print`、`os.clock`)。
|
||
|
||
### 内置函数与命名空间
|
||
|
||
- `io.print(value)` / `print(value)`:打印值(为了兼容,`print` 仍暴露在全局命名空间)
|
||
- `io.input()` / `input()`:读取一行输入
|
||
- `os.clock()`:返回当前时间戳(秒)
|
||
|
||
## 构建
|
||
|
||
```bash
|
||
cargo build --release
|
||
```
|
||
|
||
构建产物位于 `target/release/aster`,可直接执行:
|
||
|
||
```bash
|
||
./target/release/aster script.ast
|
||
```
|
||
|
||
## 依赖
|
||
|
||
无外部依赖,仅使用 Rust 标准库。
|