Refactor: 重构Parser和AST结构,以支持新的语言特性
- 更新了 ParserTest,以改进文件路径处理和输出格式。 - 在 StmtParser 中新增了 parseConstDecl 和 parseForStmt 方法,用于处理常量声明和 for 循环。 - TypeExpr现归类为Expr。TypeExpr属于Expr,语义阶段视为Expr - 添加了新的 AST 节点:PostfixExpr、TernaryExpr、ForStmt 和 ImportStmt,用于表示新的语法结构。
This commit is contained in:
232
tests/Parser/parser_comprehensive_test.fig
Normal file
232
tests/Parser/parser_comprehensive_test.fig
Normal file
@@ -0,0 +1,232 @@
|
||||
/* ==============================
|
||||
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;
|
||||
};
|
||||
Reference in New Issue
Block a user