#scripting-language #oxyscript #lexer-tokenizer

oxlex

用于 OxyScript 的简单词法分析器/标记生成器

1 个不稳定版本

0.1.0 2020年3月9日

#559 in 编程语言

BSD-3-Clause

15KB
391

OxyScript

一种轻微氧化的脚本语言

! 这是一个非常重的 WIP。目前无法正常工作 !

目前正在从堆栈虚拟机切换到寄存器虚拟机。目前不可用

这是什么?

OxyScript 是我自己实现的一个小型脚本语言
作为一个学习练习,并且因为我想要一个我可以自己控制所有
设计变量的语言。

为什么?

没有真正的原因,除了以下这些

  • 作为一个学习练习
  • 使其易于嵌入 Rust
  • 作为 Python 的替代品用于 shell 脚本(因为我讨厌 Python)
  • 只是为了好玩

目标

我实现这个的有些目标是

  • 应该能够运行基本的算法(例如,斐波那契数列)
  • 应该能够调用 Rust 函数
  • 应该提供易于嵌入的 API
  • 替代 Python 等语言进行 shell 脚本编写
  • 应该足够快

当前状态/待办事项

  • 处理整数算术
  • 处理浮点算术
  • 将脚本组织成(子)模块
  • 支持调用函数
  • 支持字符串处理
  • 支持简单的条件语句(if 无 else)
  • 支持复杂的条件语句(if/elseif/else,switch/case...)
  • 部分支持:支持循环(loop,while,for 等...)(见 FN#1)
  • 部分支持:支持自定义类型(容器)(见 FN#2)
  • 支持调用 Rust 函数
  • 支持嵌入/暴露 Rust 原生类型

设计

这是一个简单的 .oxs 脚本可能的样子

mod: inner_module {
    fn: add(lhs: int, rhs: int) ~ int {
        return lhs + rhs;
    }
}

import: core::Destroy;

// This is basically a struct.
cont: Vector {
    x: float;
    y: float;
}

impl: Destroy for Vector {
    fn: destroy(&this) {
        // Special handling for destruction of this property
    }
}

// Struct implementation
impl: Vector {
    fn: length() ~ float {
        return float::sqrt((x*x)+(y*y));
    }
}

import: inner_module::add = add_fn;

fn: main() ~ int {
    var lhs: int = 1;
    var rhs: int = 2;
    return add_fn(lhs, rhs);
}

脚注

  1. 目前只实现了循环。
  2. 容器成员函数目前有问题。

依赖项

~2.1–3.5MB
~58K SLoC