680197aafe
- 更新了 ParserTest,以改进文件路径处理和输出格式。 - 在 StmtParser 中新增了 parseConstDecl 和 parseForStmt 方法,用于处理常量声明和 for 循环。 - TypeExpr现归类为Expr。TypeExpr属于Expr,语义阶段视为Expr - 添加了新的 AST 节点:PostfixExpr、TernaryExpr、ForStmt 和 ImportStmt,用于表示新的语法结构。
233 lines
6.6 KiB
Plaintext
233 lines
6.6 KiB
Plaintext
/* ==============================
|
|
Fig Parser Comprehensive Test
|
|
============================== */
|
|
|
|
// --- 单行注释 ---
|
|
|
|
/* ---
|
|
多行注释
|
|
--- */
|
|
|
|
// ─────────────────────────────────
|
|
// 1. 变量声明 var
|
|
// ─────────────────────────────────
|
|
var x; // Any, 无初始化
|
|
var a = 10; // 推断 Int
|
|
var b: Int = 20; // 显式类型
|
|
var c := 30; // 类型推断锁定
|
|
var d: Int; // 显式类型,无初始化
|
|
var e = "hello"; // 推断 String
|
|
var f = true; // 推断 Bool
|
|
var g = null; // 推断 Null
|
|
|
|
// ─────────────────────────────────
|
|
// 2. 常量声明 const
|
|
// ─────────────────────────────────
|
|
const PI = 3.14159; // 推断 Double
|
|
const MAX: Int = 100; // 显式类型
|
|
const NAME := "Fig"; // 类型推断锁定
|
|
const T: Double = 2.718; // 显式类型
|
|
|
|
// ─────────────────────────────────
|
|
// 3. 函数定义 func
|
|
// ─────────────────────────────────
|
|
func noop() {}
|
|
func add(a: Int, b: Int) -> Int { return a + b; }
|
|
func greet(name: String) -> String { return "Hello " + name + "!"; }
|
|
func quick(x) => x * 2; // 箭头简写
|
|
func noReturn() -> Null { return null; }
|
|
|
|
// ─────────────────────────────────
|
|
// 4. Lambda 表达式
|
|
// ─────────────────────────────────
|
|
var lambda1 = func(x, y) => x + y;
|
|
var lambda2 = func(x: Int) { return x * x; };
|
|
|
|
// ─────────────────────────────────
|
|
// 5. 控制流 if / while / for
|
|
// ─────────────────────────────────
|
|
func testControlFlow() {
|
|
// if-else
|
|
if true { var z = 1; }
|
|
if (x > 0) { var z = 2; }
|
|
if a > 10 { return 1; }
|
|
else if a > 5 { return 2; }
|
|
else { return 3; }
|
|
|
|
// while
|
|
while a < 10 { a = a + 1; }
|
|
while (a > 0) { a = a - 1; }
|
|
|
|
// for (C风格,括号可选)
|
|
for var i = 0; i < 10; i = i + 1 { var _ = i; }
|
|
for (var j = 0; j < 5; j += 1) { var _ = j; }
|
|
for ; ; { break; } // 无限循环
|
|
|
|
// break / continue
|
|
while true { break; }
|
|
while true { continue; }
|
|
|
|
return 0;
|
|
}
|
|
|
|
// ─────────────────────────────────
|
|
// 6. 表达式运算符
|
|
// ─────────────────────────────────
|
|
func testOperators() -> Int {
|
|
var r = 0;
|
|
|
|
// 算术
|
|
r = 1 + 2;
|
|
r = 3 - 1;
|
|
r = 2 * 3;
|
|
r = 6 / 2;
|
|
r = 7 % 3;
|
|
r = 2 ** 3; // 幂运算
|
|
|
|
// 比较
|
|
var b1 = 1 == 1;
|
|
var b2 = 1 != 2;
|
|
var b3 = 1 < 2;
|
|
var b4 = 2 > 1;
|
|
var b5 = 1 <= 1;
|
|
var b6 = 2 >= 1;
|
|
|
|
// 逻辑
|
|
var l1 = true and false;
|
|
var l2 = true or false;
|
|
var l3 = not true;
|
|
var l4 = true && false; // &&
|
|
var l5 = true || false; // ||
|
|
|
|
// 复合赋值
|
|
r += 1;
|
|
r -= 1;
|
|
r *= 2;
|
|
r /= 2;
|
|
r %= 1;
|
|
r ^= 1;
|
|
|
|
// 位运算
|
|
var w1 = 1 & 2;
|
|
var w2 = 1 | 2;
|
|
var w3 = 1 ^ 2;
|
|
var w4 = ~1;
|
|
var w5 = 1 << 2;
|
|
var w6 = 4 >> 1;
|
|
|
|
// 前后缀 ++/--
|
|
var p = 0;
|
|
var pre = ++p;
|
|
var post = p--;
|
|
var n = --p;
|
|
|
|
// 前缀取反
|
|
var neg = -100;
|
|
var notExpr = not true;
|
|
|
|
// 三元
|
|
var t = a > 5 ? 1 : 0;
|
|
|
|
// 成员访问
|
|
var m = someObj.field;
|
|
|
|
// 类型检查 / 转换
|
|
var check = x is Int;
|
|
var cast = x as String;
|
|
|
|
// 索引
|
|
var idx = arr[0];
|
|
|
|
// 函数调用
|
|
var callRes = add(1, 2);
|
|
|
|
// 分组
|
|
var grouped = (1 + 2) * 3;
|
|
|
|
return r;
|
|
}
|
|
|
|
// ─────────────────────────────────
|
|
// 7. struct 结构体
|
|
// ─────────────────────────────────
|
|
struct Point {
|
|
public x: Int;
|
|
public y: Int;
|
|
|
|
public func toString() -> String {
|
|
return "(" + "x" + "," + "y" + ")";
|
|
}
|
|
}
|
|
|
|
struct Person {
|
|
name: String;
|
|
age: Int = 18; // 默认值
|
|
|
|
public func getName() -> String {
|
|
return name;
|
|
}
|
|
}
|
|
|
|
// ─────────────────────────────────
|
|
// 8. new 表达式
|
|
// ─────────────────────────────────
|
|
func testNewExpr() {
|
|
var p1 = new Point{1, 2}; // 位置参数
|
|
var p2 = new Point{x: 2, y: 3}; // 命名参数
|
|
var xx = 114;
|
|
var yy = 514;
|
|
var p3 = new Point{yy, xx}; // 简写
|
|
var p4 = new Point{}; // 空构造
|
|
}
|
|
|
|
// ─────────────────────────────────
|
|
// 9. interface 接口
|
|
// ─────────────────────────────────
|
|
interface Drawable {
|
|
func draw() -> String;
|
|
func getLayer() -> Int;
|
|
}
|
|
|
|
interface Printable {
|
|
func toString() -> String;
|
|
func getVersion() -> Int {
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
// ─────────────────────────────────
|
|
// 10. impl 实现
|
|
// ─────────────────────────────────
|
|
struct Circle {
|
|
public radius: Double;
|
|
}
|
|
|
|
impl Drawable for Circle {
|
|
func draw() {
|
|
return "circle";
|
|
}
|
|
func getLayer() {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
// ─────────────────────────────────
|
|
// 11. import 导入
|
|
// ─────────────────────────────────
|
|
import std.io;
|
|
import "path/to/file.fig";
|
|
|
|
// ─────────────────────────────────
|
|
// 12. 闭包与嵌套函数
|
|
// ─────────────────────────────────
|
|
func outer(x: Int) -> Function {
|
|
func inner(n: Int) -> Int {
|
|
return n * x;
|
|
}
|
|
return inner;
|
|
}
|
|
|
|
var closureMaker = func(factor: Int) {
|
|
return func(n) => n * factor;
|
|
};
|