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

Commit 99b07cd

Browse files
author
ApsarasX
committed
feat: support more unary and binary operators
1 parent ba554a3 commit 99b07cd

File tree

16 files changed

+776
-470
lines changed

16 files changed

+776
-470
lines changed

.github/workflows/build.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,15 @@ jobs:
6666
cd cmake-build-debug
6767
sudo cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-w" -G "Unix Makefiles" ..
6868
sudo cmake --build . --target staticscript document -- -j $thread_count
69-
for file in ../examples/*
69+
for file in ../examples/*ss
7070
do
7171
sudo ./lib/staticscript $file --emit-llvm -o ss-ir.ll
7272
sudo ./lib/staticscript $file -o ss-obj.o
7373
done
7474
cd ../cmake-build-release
7575
sudo cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-w" -G "Unix Makefiles" ..
7676
sudo cmake --build . --target staticscript document -- -j $thread_count
77-
for file in ../examples/*
77+
for file in ../examples/*.ss
7878
do
7979
sudo ./lib/staticscript $file --emit-llvm -o ss-ir.ll
8080
sudo ./lib/staticscript $file -o ss-obj.o
@@ -104,15 +104,15 @@ jobs:
104104
cd cmake-build-debug
105105
sudo cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-w" -G "Unix Makefiles" ..
106106
sudo cmake --build . --target staticscript document -- -j $thread_count
107-
for file in ../examples/*
107+
for file in ../examples/*ss
108108
do
109109
sudo ./lib/staticscript $file --emit-llvm -o ss-ir.ll
110110
sudo ./lib/staticscript $file -o ss-obj.o
111111
done
112112
cd ../cmake-build-release
113113
sudo cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-w" -G "Unix Makefiles" ..
114114
sudo cmake --build . --target staticscript document -- -j $thread_count
115-
for file in ../examples/*
115+
for file in ../examples/*ss
116116
do
117117
sudo ./lib/staticscript $file --emit-llvm -o ss-ir.ll
118118
sudo ./lib/staticscript $file -o ss-obj.o

builtin/ss_string.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ ss_string *KEEPALIVE ss_string_slice(ss_string *str, ssize_t from, ssize_t to) {
126126

127127
long KEEPALIVE ss_string_equals(ss_string *str1, ss_string *str2) {
128128
size_t max_size = str1->size > str2->size ? str1->size : str2->size;
129-
return strncmp(str1->buffer, str2->buffer, max_size) == 0;
129+
return strncmp(str1->buffer, str2->buffer, max_size);
130130
}
131131

132132
ssize_t KEEPALIVE ss_string_index_of_with_literal(ss_string *str, const char *literal) {

examples/operators.ss

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
let n_1 = 1;
2+
let n_2 = n_1;
3+
let n_3 = 23 + --n_1;
4+
ss_println_integer(n_1); // 0
5+
ss_println_integer(n_2); // 1
6+
ss_println_integer(n_3); // 23
7+
8+
let n_4 = n_1 - ++n_2;
9+
ss_println_integer(n_2); // 2
10+
ss_println_integer(n_4); // -2
11+
12+
let n_5 = n_2 - -1;
13+
ss_println_integer(n_5); // 3
14+
15+
let b = true;
16+
if (!b) {
17+
ss_println_string("!b is true");
18+
} else {
19+
ss_println_string("!b is false");
20+
}
21+
22+
let n_6 = ~100;
23+
ss_println_integer(n_6); // -101
24+
25+
let n_7 = 15 % 4;
26+
ss_println_integer(n_7); // 3
27+
28+
let n_8 = 1 << 2;
29+
ss_println_integer(n_8); // 4
30+
31+
let n_9 = 4 >> 2;
32+
ss_println_integer(n_9); // 1
33+
34+
ss_println_integer(99&100); // 96
35+
ss_println_integer(99|100); // 103
36+
ss_println_integer(99^100); // 7
37+
38+
if(true && true) {
39+
ss_println_string("pass");
40+
} else {
41+
ss_println_string("failed");
42+
}
43+
if(true && false) {
44+
ss_println_string("failed");
45+
} else {
46+
ss_println_string("pass");
47+
}
48+
if(false && true) {
49+
ss_println_string("failed");
50+
} else {
51+
ss_println_string("pass");
52+
}
53+
if(false && false) {
54+
ss_println_string("failed");
55+
} else {
56+
ss_println_string("pass");
57+
}
58+
59+
let n_10 = 10;
60+
n_10 += 100;
61+
ss_println_integer(n_10); // 110
62+
63+
let n_11 = 102;
64+
n_11 -= 90;
65+
ss_println_integer(n_11); // 12
66+
67+
let n_12 = 4;
68+
n_12 *= 8;
69+
ss_println_integer(n_12); // 32
70+
71+
let n_13 = 3;
72+
n_13 /= 2;
73+
ss_println_integer(n_13); // 1
74+
75+
let n_14 = 9;
76+
n_14 %= 2;
77+
ss_println_integer(n_14); // 1
78+
79+
let n_15 = 9;
80+
n_15 <<= 2;
81+
ss_println_integer(n_15); // 36
82+
83+
let n_16 = 36;
84+
n_16 >>= 2;
85+
ss_println_integer(n_16); // 9
86+
87+
let n_17 = 9;
88+
n_17 &= 2;
89+
ss_println_integer(n_17); // 0
90+
91+
let n_18 = 9;
92+
n_18 ^= 2;
93+
ss_println_integer(n_18); // 11
94+
95+
let n_19 = 9;
96+
n_19 |= 2;
97+
ss_println_integer(n_19); // 11
98+
99+
let b_2 = true;
100+
b_2 &&= false;
101+
if (b_2) {
102+
ss_println_string("failed");
103+
} else {
104+
ss_println_string("pass");
105+
}
106+
107+
let b_3 = true;
108+
b_3 ||= false;
109+
if (b_3) {
110+
ss_println_string("pass");
111+
} else {
112+
ss_println_string("failed");
113+
}
114+
115+
if ("123" == "123") {
116+
ss_println_string("pass");
117+
} else {
118+
ss_println_string("failed");
119+
}
120+
121+
if ("123" != "1234") {
122+
ss_println_string("pass");
123+
} else {
124+
ss_println_string("failed");
125+
}
126+
127+
if (1 == 1) {
128+
ss_println_string("pass");
129+
} else {
130+
ss_println_string("failed");
131+
}
132+
if (1 != 2) {
133+
ss_println_string("pass");
134+
} else {
135+
ss_println_string("failed");
136+
}
137+
138+
if (true != false) {
139+
ss_println_string("pass");
140+
} else {
141+
ss_println_string("failed");
142+
}
143+
144+
if (false == false) {
145+
ss_println_string("pass");
146+
} else {
147+
ss_println_string("failed");
148+
}

grammar/StaticScriptLexer.g4

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,44 @@ Colon: ':';
2828
SemiColon: ';';
2929
Comma: ',';
3030

31-
// 操作符
32-
Assign: '=';
33-
Plus: '+';
34-
Minus: '-';
35-
Multiply: '*';
36-
Divide: '/';
37-
LessThan: '<';
38-
GreaterThan: '>';
39-
LessThanEquals: '<=';
40-
GreaterThanEquals: '>=';
41-
Equals: '==';
42-
NotEquals: '!=';
31+
// 一元操作符
32+
PlusPlus: '++'; // number->number
33+
MinusMinus: '--'; // number->number
34+
Not: '!'; // boolean->boolean
35+
BitNot: '~'; // number->number
36+
37+
// 二元操作符
38+
Plus: '+'; // (number|string)->(number|string): Plus既是一元操作符也是二元操作符
39+
Minus: '-'; // number->number: Minus既是一元操作符也是二元操作符
40+
Multiply: '*'; // number->number
41+
Divide: '/'; // number->number
42+
Modulus: '%'; // number->number
43+
BitAnd: '&'; // number->number
44+
BitXOr: '^'; // number->number
45+
BitOr: '|'; // number->number
46+
LeftShift: '<<'; // number->number
47+
RightShift: '>>'; // number->number
48+
LessThan: '<'; // number->boolean
49+
GreaterThan: '>'; // number->boolean
50+
LessThanEquals: '<='; // number->boolean
51+
GreaterThanEquals: '>='; // number->boolean
52+
Equals: '=='; // (number|boolean|string)->boolean
53+
NotEquals: '!='; // (number|boolean|string)->boolean
54+
And: '&&'; // boolean->boolean
55+
Or: '||'; // boolean->boolean
56+
Assign: '='; // (number|boolean|string)->(number|boolean|string)
57+
PlusAssign: '+='; // (number|string)->(number|string)
58+
MinusAssign: '-='; // number->number
59+
MultiplyAssign: '*='; // number->number
60+
DivideAssign: '/='; // number->number
61+
ModulusAssign: '%='; // number->number
62+
BitAndAssign: '&='; // number->number
63+
BitXorAssign: '^='; // number->number
64+
BitOrAssign: '|='; // number->number
65+
LeftShiftAssign: '<<='; // number->number
66+
RightShiftAssign: '>>='; // number->number
67+
AndAssign: '&&='; // boolean->boolean
68+
OrAssign: '||='; // boolean->boolean
4369

4470
// 字面量
4571
BooleanLiteral: 'true' | 'false';

grammar/StaticScriptParser.g4

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,6 @@ functionBody
7979
: compoundStatement
8080
;
8181

82-
callExpression
83-
: Identifier OpenParen argumentList? CloseParen
84-
;
85-
8682
argumentList
8783
: expressionList
8884
;
@@ -96,16 +92,27 @@ expressionStatement
9692
;
9793

9894
expression
99-
: literal
100-
| OpenParen expression CloseParen
101-
| Identifier
102-
| callExpression
103-
| uop=Minus expression
104-
| expression bop=(Multiply | Divide) expression
105-
| expression bop=(Plus | Minus) expression
106-
| expression bop=(LessThan | GreaterThan | LessThanEquals | GreaterThanEquals) expression
107-
| expression bop=(Equals | NotEquals) expression
108-
| <assoc=right> expression bop=Assign expression
95+
: literal # LiteralExpr
96+
| Identifier # IdentifierExpr
97+
| OpenParen expression CloseParen # ParenExpr
98+
| callExpression # CallExpr
99+
| expression uop=(PlusPlus | MinusMinus) # PostfixUnaryExpr
100+
| <assoc=right> uop=(Not | BitNot | Plus | Minus | PlusPlus | MinusMinus) expression # PrefixUnaryExpr
101+
| expression bop=(Multiply | Divide | Modulus) expression # BinaryExpr
102+
| expression bop=(Plus | Minus) expression # BinaryExpr
103+
| expression bop=(LeftShift | RightShift) expression # BinaryExpr
104+
| expression bop=(LessThan | GreaterThan | LessThanEquals | GreaterThanEquals) expression # BinaryExpr
105+
| expression bop=(Equals | NotEquals) expression # BinaryExpr
106+
| expression bop=BitAnd expression # BinaryExpr
107+
| expression bop=BitXOr expression # BinaryExpr
108+
| expression bop=BitOr expression # BinaryExpr
109+
| expression bop=And expression # BinaryExpr
110+
| expression bop=Or expression # BinaryExpr
111+
| <assoc=right> expression bop=(Assign | PlusAssign | MinusAssign | MultiplyAssign | DivideAssign | ModulusAssign | LeftShiftAssign | RightShiftAssign | BitAndAssign | BitXorAssign | BitOrAssign | AndAssign | OrAssign) expression # BinaryExpr
112+
;
113+
114+
callExpression
115+
: Identifier OpenParen argumentList? CloseParen
109116
;
110117

111118
literal

include/AST/ASTBuilder.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,21 @@ class ASTBuilder final : public StaticScriptParserVisitor {
5454

5555
antlrcpp::Any visitExpressionStatement(StaticScriptParser::ExpressionStatementContext *ctx) override;
5656

57-
antlrcpp::Any visitExpression(StaticScriptParser::ExpressionContext *ctx) override;
57+
antlrcpp::Any visitExpression(StaticScriptParser::ExpressionContext *ctx);
58+
59+
antlrcpp::Any visitLiteralExpr(StaticScriptParser::LiteralExprContext *ctx) override;
60+
61+
antlrcpp::Any visitIdentifierExpr(StaticScriptParser::IdentifierExprContext *ctx) override;
62+
63+
antlrcpp::Any visitParenExpr(StaticScriptParser::ParenExprContext *ctx) override;
64+
65+
antlrcpp::Any visitCallExpr(StaticScriptParser::CallExprContext *ctx) override;
66+
67+
antlrcpp::Any visitPostfixUnaryExpr(StaticScriptParser::PostfixUnaryExprContext *ctx) override;
68+
69+
antlrcpp::Any visitPrefixUnaryExpr(StaticScriptParser::PrefixUnaryExprContext *ctx) override;
70+
71+
antlrcpp::Any visitBinaryExpr(StaticScriptParser::BinaryExprContext *ctx) override;
5872

5973
antlrcpp::Any visitLiteral(StaticScriptParser::LiteralContext *ctx) override;
6074

include/AST/ExprNode.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ class UnaryOperatorExprNode : public ExprNode {
113113
void accept(const SharedPtr<ASTVisitor> &visitor) override;
114114

115115
unsigned int opCode;
116+
bool isPostfix = false;
116117
SharedPtr<ExprNode> subExpr = nullptr;
117118
};
118119

include/CodeGen/IRGenerator.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ class IRGenerator : public ASTVisitor {
1414

1515
void visit(const SharedPtr<ModuleNode> &module) override;
1616

17-
void visit(const SharedPtr<BuiltinTypeNode> &builtinType) override;
18-
1917
void visit(const SharedPtr<VarDeclNode> &varDecl) override;
2018

2119
void visit(const SharedPtr<ParmVarDeclNode> &paramVarDecl) override;

0 commit comments

Comments
 (0)