Skip to content
This repository was archived by the owner on Jan 8, 2023. It is now read-only.

Commit 7fbdf68

Browse files
author
ApsarasX
committed
feat: complete the remaining functions of the visitor
1 parent 9f9a72e commit 7fbdf68

File tree

16 files changed

+281
-159
lines changed

16 files changed

+281
-159
lines changed

cmake/AddDoxygen.cmake

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ find_package(Doxygen REQUIRED dot)
22

33
if (DOXYGEN_FOUND)
44
set(DOXYGEN_INCLUDE_PATH ${PROJECT_SOURCE_DIR}/include)
5-
set(DOXYGEN_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/docs)
5+
set(DOXYGEN_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/doxygen)
66
set(DOXYGEN_OUTPUT_LANGUAGE Chinese)
77
set(DOXYGEN_EXTRACT_ALL YES)
88
set(DOXYGEN_EXTRACT_STATIC YES)
@@ -26,6 +26,4 @@ if (DOXYGEN_FOUND)
2626
${PROJECT_SOURCE_DIR}/lib
2727
${PROJECT_SOURCE_DIR}/README-zh_CN.md
2828
)
29-
endif ()
30-
31-
add_dependencies(doxygen staticscript)
29+
endif ()

grammar/StaticScriptParser.g4

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ functionDeclaration
7272
;
7373

7474
parameterList
75-
: Identifier typeAnnotation? (Comma Identifier typeAnnotation?)*
75+
: Identifier typeAnnotation (Comma Identifier typeAnnotation)*
7676
;
7777

7878
functionBody
@@ -123,20 +123,21 @@ ifStatement
123123
;
124124

125125
iterationStatement
126-
: While OpenParen expression CloseParen statement
127-
| For OpenParen forInitExpr SemiColon forCondExpr SemiColon forLoopExpr CloseParen statement
126+
: whileStatement
127+
| forStatement
128128
;
129129

130-
forInitExpr
131-
: (expressionList | variableDeclarators)?
130+
whileStatement
131+
: While OpenParen expression CloseParen statement
132132
;
133133

134-
forCondExpr
135-
: expression?
134+
forStatement
135+
: For OpenParen forInit? SemiColon forCondition=expression? SemiColon forUpdate=expressionList? CloseParen statement
136136
;
137137

138-
forLoopExpr
139-
: expressionList?
138+
forInit
139+
: variableDeclarators
140+
| expressionList
140141
;
141142

142143
expressionList

include/AST/Base.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
class ASTNode {
77
public:
88
virtual ~ASTNode() = default;
9-
10-
virtual void codegen() = 0;
119
};
1210

1311

include/AST/Decl.h

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include "AST/Expr.h"
88

99
enum class VarModifier {
10-
Let, Const
10+
Let, Const, Param
1111
};
1212

1313
class Decl : public ASTNode {
@@ -18,29 +18,39 @@ class Decl : public ASTNode {
1818
// 变量声明
1919
class VarDecl : public Decl {
2020
public:
21-
~VarDecl() override = default;
21+
VarDecl();
22+
23+
VarDecl(VarModifier modifier, String name, const SharedPtr<BuiltinType> &type);
2224

23-
void codegen() override;
25+
VarDecl(VarModifier modifier, String name, const SharedPtr<BuiltinType> &type, const SharedPtr<Expr> &defaultVal);
26+
27+
~VarDecl() override = default;
2428

2529
VarModifier modifier;
26-
SharedPtr<BuiltinType> type;
2730
String name;
28-
SharedPtr<Expr> initVal;
31+
SharedPtr<BuiltinType> type;
32+
SharedPtr<Expr> defaultVal;
2933
};
3034

3135
// 函数参数声明
3236
class ParmVarDecl : public VarDecl {
3337
public:
38+
ParmVarDecl(const String &name, const SharedPtr<BuiltinType> &type);
39+
3440
~ParmVarDecl() override = default;
3541
};
3642

3743
// 函数声明
3844
class FunctionDecl : public Decl {
3945
public:
46+
FunctionDecl(String name, const SharedPtrVector<ParmVarDecl> &params, const SharedPtr<BuiltinType> &returnType,
47+
const SharedPtr<CompoundStmt> &body);
48+
4049
~FunctionDecl() override = default;
4150

51+
String name;
4252
SharedPtrVector<ParmVarDecl> params;
43-
SharedPtr<Type> returnType;
53+
SharedPtr<BuiltinType> returnType;
4454
SharedPtr<CompoundStmt> body;
4555
};
4656

include/AST/Expr.h

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include "AST/Type.h"
55
#include "AST/Stmt.h"
66

7+
class FunctionDecl;
8+
79
class Expr : public ValueStmt {
810
public:
911
~Expr() override = default;
@@ -26,8 +28,6 @@ class BooleanLiteralExpr : public LiteralExpr {
2628

2729
~BooleanLiteralExpr() override = default;
2830

29-
void codegen() override;
30-
3131
bool literal;
3232

3333
};
@@ -39,8 +39,6 @@ class IntegerLiteralExpr : public LiteralExpr {
3939

4040
~IntegerLiteralExpr() override = default;
4141

42-
void codegen() override;
43-
4442
int literal;
4543
};
4644

@@ -51,8 +49,6 @@ class StringLiteralExpr : public LiteralExpr {
5149

5250
~StringLiteralExpr() override = default;
5351

54-
void codegen() override;
55-
5652
String literal;
5753
};
5854

@@ -69,45 +65,40 @@ class IdentifierExpr : public Expr {
6965

7066
~IdentifierExpr() override = default;
7167

72-
void codegen() override;
73-
7468
String name;
7569
};
7670

7771
// 函数调用表达式
7872
class CallExpr : public Expr {
7973
public:
74+
75+
CallExpr(String calleeName, const SharedPtrVector<Expr> &args);
76+
8077
~CallExpr() override = default;
8178

82-
void codegen() override;
79+
String calleeName;
80+
SharedPtr<FunctionDecl> callee;
81+
SharedPtrVector<Expr> args;
8382
};
8483

8584
// 一元运算表达式
8685
class UnaryOperatorExpr : public Expr {
8786
public:
88-
UnaryOperatorExpr();
89-
9087
UnaryOperatorExpr(size_t operatorCode, const SharedPtr<Expr> &subExpr);
9188

9289
~UnaryOperatorExpr() override = default;
9390

94-
void codegen() override;
95-
96-
size_t operatorCode;
91+
size_t operatorCode{};
9792
SharedPtr<Expr> subExpr;
9893
};
9994

10095
// 二元运算表达式
10196
class BinaryOperatorExpr : public Expr {
10297
public:
103-
BinaryOperatorExpr();
104-
10598
BinaryOperatorExpr(size_t operatorCode, const SharedPtr<Expr> &lhs, const SharedPtr<Expr> &rhs);
10699

107100
~BinaryOperatorExpr() override = default;
108101

109-
void codegen() override;
110-
111102
size_t operatorCode;
112103
SharedPtr<Expr> lhs, rhs;
113104
};

include/AST/Module.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,14 @@ class Module {
88
public:
99
~Module() = default;
1010

11-
explicit Module(String filename);
12-
1311
explicit Module(String filename, SharedPtrVector<Stmt> childStmts);
1412

1513
[[nodiscard]] const String &getFilename() const;
1614

1715
[[nodiscard]] bool isEmpty() const;
1816

19-
void codegen();
20-
2117
private:
2218
const String filename;
23-
bool empty;
2419
SharedPtrVector<Stmt> childStmts;
2520
};
2621

include/AST/Stmt.h

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55

66
class VarDecl;
77

8+
class FunctionDecl;
9+
10+
class Expr;
11+
812
class Stmt : public ASTNode {
913
public:
1014
~Stmt() override = default;
@@ -19,37 +23,71 @@ class ValueStmt : public Stmt {
1923
// 复合语句
2024
class CompoundStmt : public Stmt {
2125
public:
26+
27+
explicit CompoundStmt(const SharedPtrVector<Stmt> &childStmts);
28+
2229
~CompoundStmt() override = default;
30+
31+
SharedPtrVector<Stmt> childStmts;
2332
};
2433

25-
// 声明语句
34+
// 变量声明语句
2635
class VarDeclStmt : public Stmt {
2736
public:
2837
~VarDeclStmt() override = default;
29-
virtual void pushVarDecl(SharedPtr<VarDecl> varDecl);
3038

31-
void codegen() override;
39+
virtual void pushVarDecl(const SharedPtr<VarDecl> &varDecl);
3240

3341
private:
3442
SharedPtrVector<VarDecl> childVarDecls;
3543
};
3644

45+
// 函数声明语句
46+
class FunctionDeclStmt : public Stmt {
47+
public:
48+
explicit FunctionDeclStmt(const SharedPtr<FunctionDecl> &childFunctionDecl);
49+
50+
~FunctionDeclStmt() override = default;
51+
52+
private:
53+
SharedPtr<FunctionDecl> childFunctionDecl;
54+
};
55+
3756
// if语句
3857
class IfStmt : public Stmt {
3958
public:
59+
IfStmt(const SharedPtr<Expr> &condition, const SharedPtr<Stmt> &thenStmt, const SharedPtr<Stmt> &elseStmt);
60+
4061
~IfStmt() override = default;
62+
63+
SharedPtr<Expr> condition;
64+
SharedPtr<Stmt> thenBody;
65+
SharedPtr<Stmt> elseBody;
4166
};
4267

4368
// while语句
4469
class WhileStmt : public Stmt {
4570
public:
71+
WhileStmt(const SharedPtr<Expr> &condition, const SharedPtr<Stmt> &body);
72+
4673
~WhileStmt() override = default;
74+
75+
SharedPtr<Expr> condition;
76+
SharedPtr<Stmt> body;
4777
};
4878

4979
// for语句
5080
class ForStmt : public Stmt {
5181
public:
82+
ForStmt(const SharedPtr<VarDeclStmt> &forInitVarDecls, const SharedPtrVector<Expr> &forInitExprList, const SharedPtr<Expr> &forCondition,
83+
const SharedPtrVector<Expr> &forUpdate, const SharedPtr<Stmt> &body);
84+
5285
~ForStmt() override = default;
86+
SharedPtr<VarDeclStmt> forInitVarDecls;
87+
SharedPtrVector<Expr> forInitExprList;
88+
SharedPtr<Expr> forCondition;
89+
SharedPtrVector<Expr> forUpdate;
90+
SharedPtr<Stmt> body;
5391
};
5492

5593
// continue语句
@@ -67,7 +105,10 @@ class BreakStmt : public Stmt {
67105
// return语句
68106
class ReturnStmt : public Stmt {
69107
public:
108+
explicit ReturnStmt(const SharedPtr<Expr> &argument);
109+
70110
~ReturnStmt() override = default;
111+
SharedPtr<Expr> argument;
71112
};
72113

73114

include/AST/Type.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ class BuiltinType : public Type {
2323

2424
~BuiltinType() override = default;
2525

26-
void codegen() override;
27-
2826
static inline const SharedPtr<BuiltinType> BOOLEAN_TYPE = makeShared<BuiltinType>(TypeKind::Boolean);
2927
static inline const SharedPtr<BuiltinType> INTEGER_TYPE = makeShared<BuiltinType>(TypeKind::Integer);
3028
static inline const SharedPtr<BuiltinType> STRING_TYPE = makeShared<BuiltinType>(TypeKind::String);

include/Driver/Visitor.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ class Visitor : public StaticScriptParserBaseVisitor {
6060

6161
antlrcpp::Any visitIterationStatement(StaticScriptParser::IterationStatementContext *ctx) override;
6262

63-
antlrcpp::Any visitForInitExpr(StaticScriptParser::ForInitExprContext *ctx) override;
63+
antlrcpp::Any visitWhileStatement(StaticScriptParser::WhileStatementContext *ctx) override;
6464

65-
antlrcpp::Any visitForCondExpr(StaticScriptParser::ForCondExprContext *ctx) override;
65+
antlrcpp::Any visitForStatement(StaticScriptParser::ForStatementContext *ctx) override;
6666

67-
antlrcpp::Any visitForLoopExpr(StaticScriptParser::ForLoopExprContext *ctx) override;
67+
antlrcpp::Any visitForInit(StaticScriptParser::ForInitContext *ctx) override;
6868

6969
antlrcpp::Any visitExpressionList(StaticScriptParser::ExpressionListContext *ctx) override;
7070

lib/AST/Decl.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
#include "AST/Decl.h"
22

3-
void VarDecl::codegen() {
3+
#include <utility>
44

5-
}
5+
VarDecl::VarDecl() : modifier(VarModifier::Let) {}
6+
7+
VarDecl::VarDecl(VarModifier modifier, String name, const SharedPtr<BuiltinType> &type) : modifier(modifier), name(std::move(name)), type(type) {}
8+
9+
VarDecl::VarDecl(VarModifier modifier, String name, const SharedPtr<BuiltinType> &type, const SharedPtr<Expr> &defaultVal) : modifier(modifier),
10+
name(std::move(name)),
11+
type(type),
12+
defaultVal(defaultVal) {}
13+
14+
ParmVarDecl::ParmVarDecl(const String &name, const SharedPtr<BuiltinType> &type) : VarDecl(VarModifier::Param, name, type) {}
15+
16+
FunctionDecl::FunctionDecl(String name, const SharedPtrVector<ParmVarDecl> &params, const SharedPtr<BuiltinType> &returnType,
17+
const SharedPtr<CompoundStmt> &body) : name(std::move(name)), params(params), returnType(returnType), body(body) {}

0 commit comments

Comments
 (0)