- 更新了 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;
|
||
};
|