/L-Lang-Compiler

l-lang-compiler

Primary LanguageJava

L-Lang-Compiler

L-Lang 一个类Java的面向对象语言, 去除了new, 每行结尾的分号等冗余的字符 实现了函数作为一等公民,可以赋值、作为函数参数,支持闭包等特性, 具体示例查看example目录

vscode运行

示例

函数

// 定义一个函数 返回值为函数类型 函数类型返回值为int,参数为空
function int() fun(){
    int a = 0
    int b = 1
    int fibonacci(){
        int c = a
        a = b
        b = a+c
        return c
    }
    return fibonacci
}
// 定义一个函数变量 接收返回值为int,参数个数为0的函数
function int() fib = fun()
// 打印斐波那契数列,在闭包里记住了相邻两次计算的结果
for (int i = 0;i < 80;i += 1){
    println(fib())
}

对象与数组实例化

A a = A() // 实例化一个对象A
A a = A("ass",1) // 实例化一个对象A,构造函数接受两个参数
int[][] a = int[10][10] // 实例化一个10*10的数组a
int[][] b = {{1,2,3}, {2+1<<9}, {1,2,2345}} // 带初始化值的数组b

导入新模块

// 导入模块sys.math 
import sys.math
// 导入模块并将模块命名为S 后续直接使用直接 用S.(变量|类|函数)等
import sys.strings as S 

下面给出一个打印心形以及排序算法的示例

int[] a = {1, 2, 10, 8, 7, 6, 3, 20, 5}

void printHeart() {
    for (float y = 1.5f; y > -1.5f; y = y - 0.1f) {
        for (float x = -1.5f; x < 1.5f; x = x + 0.05f) {
            float a = x * x + y * y - 1;
            boolean flag = a * a * a - x * x * y * y * y <= 0.0f;
            if (flag) print("*"); else print(" ");
        }
        println();
    }
}
printHeart();

void printArr() {
    for (int i = 0;i < a.length;i+=1) {
        print(a[i] + " ");
    }
    println();
}

class Sort {
    void sort(int[] a);

    string name() {
        return "";
    }

    void swap(int[] a, int i, int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

class QuickSort extends Sort {
    int a;

    void sort(int[] a) {
      quickSort(a, 0, a.length - 1);
    }

    void quickSort(int[] a, int l, int r) {
        if (l >= r) return;
        int p = partition(a, l, r);
        quickSort(a, l, p - 1);
        quickSort(a, p + 1, r);
    }

    int partition(int[] a, int l, int r) {
        int t = a[l], i = l, j = r + 1;
        while (true) {
            while (a[i+=1] < t && i != r);
            while (a[j-=1] > t && j != l);
            if (i >= j) break
            swap(a, i, j);
        }
        swap(a, l, j);
        return j;
    }

    string name() {
        return "快速排序";
    }
}

class MergeSort extends Sort {
    int[] aux;
    void sort(int[] a) {
        aux = int[a.length];
        mergeSort(a, 0, a.length - 1);
    }

    void mergeSort(int[] a, int l, int r) {
        if (l >= r) return;
        int mid = l + (r - l) / 2;
        mergeSort(a, l, mid);
        mergeSort(a, mid + 1, r);
        merge(a, l, mid, r);
    }

    void merge(int[] a, int l, int m, int r) {
        int i = l, j = m + 1;
        for (int k = l;k <= r;k+=1) {
            aux[k] = a[k];
        }
        int k = l;
        while (i <= m && j <= r) {
            if (aux[i] < aux[j]) {
                a[k] = aux[i];
                k += 1;
                i += 1;
            } else {
                a[k] = aux[j];
                k += 1;
                j += 1;
            }
        }
        while (i <= m) {
            a[k] = aux[i];
            k += 1;
            i += 1;
        }
        while (j <= r) {
            a[k] = aux[j];
            k += 1;
            j += 1;
        }
    }

    string name() {
        return "归并排序";
    }
}

class SelectionSort extends Sort {
    void sort(int[] a) {
        for (int i = 0;i < a.length;i+=1) {
            int minIdx = i;
            for (int j = i + 1;j < a.length;j+=1) {
                if (a[j] < a[minIdx]) {
                    minIdx = j;
                }
            }
            swap(a, i, minIdx);
        }
    }

    string name() {
        return "选择排序";
    }
}

void sort(Sort sort, int[] array) {
    println("当前选用的排序算法: " + sort.name());
    sort.sort(array);
}

println("原数组: ");
printArr();
Sort quickSort = QuickSort();
Sort mergeSort = MergeSort();
Sort selectionSort = SelectionSort();

sort(mergeSort, a);

println("排序后:");
printArr();