#语言 #表达式 #语句 #解释型 #参数 #比较 #字面量

bin+lib vm_lang

用 Rust 编写的简单解释型语言

1 个不稳定版本

0.1.1 2022 年 11 月 18 日
0.1.0 2022 年 11 月 18 日

#1927Rust 模式

每月 33 次下载

AGPL-3.0

70KB
1.5K SLoC

VM_Lang

作为一个有趣的练习,用 Rust 编写的基本解释型编程语言。

基本结构

用此语言编写的程序由多个函数组成,其中必须有一个名为 main 的函数,该函数不接受任何参数,返回类型为 void

函数

有一个名称,一组参数以及可选的返回类型,后面跟着一个语句块。

示例

fn some_func(a: int, b: [string]): boolean {
    // Statements
    return true
}

如果一个函数有返回类型,它必须在函数的每个路径上使用 return 语句,否则返回是可选的。

注释

一行中的任何文本(除非双斜杠 // 在字符串字面量内)在行后都是被忽略的。

语句

Let

声明一个变量,类型是推断的。

示例

let a = 0;

While

当提供的表达式为真时继续循环的循环。

示例

while true {
    // Statements
}

For

遍历列表的 for-each 循环。

示例

let some_list = [1, 4, 9];
for (a in some_list) {
    // Statements
}

If

一个分支语句,当表达式为真时运行块。

示例

if true {
    // Statements
}

If else

一个分支语句,当表达式为真时运行第一个块,否则运行 else 块。

示例

let i = 4;
if i < 2 {
    // Statements
} else {
    // Statements
}

返回类型

使用提供的表达式从当前函数返回,表达式的类型必须与函数的返回类型相同。

示例

return 54;

返回 void

当函数的返回类型为 void 时从当前函数返回。

示例

return;

表达式

以分号 ; 结尾的表达式也是一个语句。

示例

i++;

封装一组语句以创建新的作用域。

示例

{
    // Statements
}

表达式

语言中有许多表达式,按照优先级排序如下:

赋值

重新分配先前声明的变量。

示例

a = 2;

比较

比较两个相同类型的表达式,返回布尔值。

只支持布尔表达式的比较: - || | 'or' 为真,如果任一表达式为真。 - && | 'and' 为真,如果两个表达式都为真。

支持所有类型的比较:- ==equals 表示表达式相同。 - !=not equals 表示表达式不相同。 - <=Less than or equal to 表示第一个表达式小于或等于第二个表达式。 - >=Greater than or equal to 表示第一个表达式大于或等于第二个表达式。 - <Less than 表示第一个表达式严格小于第二个表达式。 - >Greater than 表示第一个表达式严格大于第二个表达式。

示例

2 < 4

算术运算

在类型为 int 的两个表达式之间执行算术运算。

当前支持的算术运算包括

  • + | 加
  • - | 减
  • * | 乘
  • / | 除

示例

2 + 4

一元运算

对单个表达式进行的运算。

当前支持的一元运算包括

  • ! | 非
  • ++ | 将值增加 1,根据该操作是在表达式之前还是之后,这将在读取值之前或之后完成。
  • -- | 将值减少 1,根据该操作是在表达式之前还是之后,这将在读取值之前或之后完成。

示例

i++;

函数调用

调用一个函数。

示例

some_func(42, "this function has two args");

列表索引

通过索引从列表中检索值。

示例

let some_list = [1, 5, 9];
some_list[1]; // Returns 5

字面量

任何可用的类型(除 void 外)的字面量。

示例

54

括号表达式

任何括号内的表达式。

示例

(1 + 2)

类型

当前语言中有四种类型可用

  • int,例如:-54
  • bool,例如:true
  • string,例如:"Hello! This is a string"
  • 列表,声明为 [TYPE],其中 TYPE 可以是上述任何类型,例如:[0, 1, 99, 200]
  • void,从不直接使用,但在没有声明其他类型时使用,例如没有返回类型的函数。

内置函数

提供了一些内置函数以执行特定任务。

print_number

将数字打印到标准输出。

参数:- number: int | 要打印的数字。

返回:`Void

print_string

将字符串打印到标准输出。

参数:- text: string | 要打印的字符串。

返回:Void

print_bool

将布尔值打印到标准输出。

参数:- val: bool | 要打印的布尔值。

返回:Void

read_number

从标准输入读取一个数字。

参数:None

返回:- number: int | 读取到的数字。

read_string

从标准输入读取一个字符串。

参数:None

返回:- val: string | 读取到的字符串。

read_bool

从标准输入读取一个布尔值。

参数:None

返回:- val: bool | 读取到的布尔值。

read_file

给定一个路径,将文件内容读取为字符串。

参数:- file_path: string | 相对于当前目录的文件路径。

返回:- file_content: string | 文件内容。

split_string

给定一个字符串和一个'分隔符',在每个'分隔符'出现的位置分割字符串,返回包含各部分的列表。

参数:- text: string | 要分割的文本。 - splitter: string | 分隔文本的文本。

返回:- parts: [string] | 包含通过每个splitter分割的text的每个部分的列表。

parse_int

将字符串解析为数字。

参数:- text: string | 要解析的文本。

返回:- num: int | 解析的文本。

依赖

~2.4–5.5MB
~89K SLoC