- 更新了 ParserTest,以改进文件路径处理和输出格式。 - 在 StmtParser 中新增了 parseConstDecl 和 parseForStmt 方法,用于处理常量声明和 for 循环。 - TypeExpr现归类为Expr。TypeExpr属于Expr,语义阶段视为Expr - 添加了新的 AST 节点:PostfixExpr、TernaryExpr、ForStmt 和 ImportStmt,用于表示新的语法结构。
70 lines
1.7 KiB
C++
70 lines
1.7 KiB
C++
/*!
|
|
@file src/Ast/Expr/LambdaExpr.hpp
|
|
@brief Lambda表达式定义
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <Ast/Base.hpp>
|
|
#include <Ast/Stmt/FnDefStmt.hpp>
|
|
|
|
namespace Fig
|
|
{
|
|
struct LambdaExpr final : public Expr
|
|
{
|
|
// func (params) [-> return type] ([=> expr] / [ {stmt} ])
|
|
|
|
DynArray<Param *> params;
|
|
Expr *returnType;
|
|
AstNode *body; // expr/blockstmt
|
|
bool isExprBody;
|
|
|
|
DynArray<UpvalueInfo> upvalues;
|
|
|
|
LambdaExpr()
|
|
{
|
|
type = AstType::LambdaExpr;
|
|
}
|
|
|
|
LambdaExpr(
|
|
DynArray<Param *> _params,
|
|
Expr *_returnType,
|
|
AstNode *_body,
|
|
bool _isExprBody,
|
|
SourceLocation _location) :
|
|
params(std::move(_params)),
|
|
returnType(_returnType),
|
|
body(_body),
|
|
isExprBody(_isExprBody)
|
|
{
|
|
type = AstType::LambdaExpr;
|
|
location = std::move(_location);
|
|
}
|
|
|
|
virtual String toString() const override
|
|
{
|
|
String specifying = "<LambdaExpr 'func (";
|
|
for (auto &p : params)
|
|
{
|
|
if (p != params.front())
|
|
{
|
|
specifying += ", ";
|
|
}
|
|
specifying += p->toString();
|
|
}
|
|
if (isExprBody)
|
|
{
|
|
specifying += ") => ";
|
|
specifying += body->toString();
|
|
}
|
|
else
|
|
{
|
|
specifying += ") {";
|
|
specifying += body->toString();
|
|
specifying.push_back(U'}');
|
|
}
|
|
specifying += "'>";
|
|
return specifying;
|
|
}
|
|
};
|
|
}; // namespace Fig
|