Skip to content

Commit 960910b

Browse files
committed
add label, start to refactor jumping
1 parent 6943c7e commit 960910b

14 files changed

+40
-159
lines changed

Cmc/Core/Environment.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,17 +97,20 @@ where string.Equals(declaration.Name, name, Ordinal)
9797
/// <summary>
9898
/// If there's no such declaration, this funciton will return null.
9999
/// </summary>
100-
/// <param name="name">the name of the required declaration</param>
100+
/// <param name="name">
101+
/// the name of the required declaration.
102+
/// if it's null, find the nearest one.
103+
/// </param>
101104
/// <returns>the declaration</returns>
102105
[CanBeNull]
103-
public LabelDeclaration FindLabelDeclarationByName([NotNull] string name)
106+
public LabelDeclaration FindLabelDeclarationByName([CanBeNull] string name)
104107
{
105108
var env = this;
106109
do
107110
{
108111
foreach (var declaration in
109112
from declaration in env.Declarations
110-
where declaration is LabelDeclaration && string.Equals(declaration.Name, name, Ordinal)
113+
where declaration is LabelDeclaration && (null == name || string.Equals(declaration.Name, name, Ordinal))
111114
select declaration)
112115
return (LabelDeclaration) declaration;
113116
} while ((env = env._outer) != null);

Cmc/Decl/Declaration.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ public LabelDeclaration(
102102
base(metaData, name)
103103
{
104104
}
105+
106+
public override IEnumerable<string> Dump() => new[] {$"label [{Name}]\n"};
105107
}
106108

107109
/// <summary>

Cmc/Expr/LambdaExpression.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public LambdaExpression(
3535
public override void SurroundWith(Environment environment)
3636
{
3737
base.SurroundWith(environment);
38+
var endLabel = new LabelDeclaration(MetaData, "");
39+
endLabel.SurroundWith(Env);
3840
if (DeclaredType is UnknownType unknownType)
3941
{
4042
unknownType.SurroundWith(Env);
@@ -58,7 +60,7 @@ from i in ParameterList
5860
Body.SurroundWith(bodyEnv);
5961
var retTypes = Body.FindReturnStatements().Select(i =>
6062
{
61-
i.WhereToJump = this;
63+
i.Label = endLabel;
6264
return i.Expression.GetExpressionType();
6365
}).ToList();
6466
// FEATURE #24
@@ -79,6 +81,7 @@ from i in ParameterList
7981
// Body = Body.OptimizedStatementList;
8082
while (null != Body.ConvertedStatementList)
8183
Body = Body.ConvertedStatementList;
84+
Body.Statements.Add(endLabel);
8285
}
8386

8487
public override Type GetExpressionType() => Type;

Cmc/Stmt/AssignmentStatement.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using Cmc.Core;
5-
using Cmc.Decl;
65
using Cmc.Expr;
76
using JetBrains.Annotations;
87
using Environment = Cmc.Core.Environment;
@@ -48,8 +47,7 @@ public override void SurroundWith(Environment environment)
4847
else validLhs.Declaration.UsageCount++;
4948
if (!(RhsExpression is AtomicExpression))
5049
{
51-
ConvertedStatementList = new StatementList(MetaData,
52-
new VariableDeclaration(MetaData, ""));
50+
ConvertedStatementList = new StatementList(MetaData);
5351
}
5452
}
5553

Cmc/Stmt/Statement.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,7 @@ public override void SurroundWith(Environment environment)
4747
Expression.SurroundWith(Env);
4848
var res = Expression.ConvertedResult;
4949
if (null != res)
50-
ConvertedStatementList = new StatementList(MetaData,
51-
res.ConvertedStatements.Concat(new[]
52-
{
53-
new ExpressionStatement(MetaData, res.ConvertedExpression)
54-
}).ToArray());
50+
ConvertedStatementList = new StatementList(MetaData);
5551
}
5652

5753
public override IEnumerable<string> Dump() => new[] {"expression statement:\n"}
@@ -60,7 +56,7 @@ public override IEnumerable<string> Dump() => new[] {"expression statement:\n"}
6056

6157
public class ReturnStatement : ExpressionStatement
6258
{
63-
public LambdaExpression WhereToJump;
59+
public LabelDeclaration Label;
6460

6561
public ReturnStatement(
6662
MetaData metaData,
@@ -75,7 +71,6 @@ public override void SurroundWith(Environment environment)
7571
if (Expression is AtomicExpression) return;
7672
var variableName = $"{MetaData.TrimedFileName}{MetaData.LineNumber}{GetHashCode()}";
7773
ConvertedStatementList = new StatementList(MetaData,
78-
new VariableDeclaration(MetaData, variableName, Expression, true),
7974
new ReturnStatement(MetaData, new VariableExpression(MetaData, variableName)));
8075
}
8176

@@ -97,6 +92,7 @@ public enum Jump
9792
}
9893

9994
public readonly Jump JumpKind;
95+
public LabelDeclaration Label;
10096

10197
public JumpStatement(
10298
MetaData metaData,

Cmc/Stmt/StatementList.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,16 @@ namespace Cmc.Stmt
99
public class StatementList : Statement
1010
{
1111
[NotNull] public IList<Statement> Statements;
12+
[NotNull] public IList<Statement> JumpOutStatements;
1213

1314
public StatementList(
1415
MetaData metaData,
1516
params Statement[] statements) :
16-
base(metaData) => Statements = statements;
17+
base(metaData)
18+
{
19+
JumpOutStatements = new List<Statement>();
20+
Statements = statements;
21+
}
1722

1823
public override void SurroundWith(Environment environment)
1924
{
@@ -45,7 +50,7 @@ public override void SurroundWith(Environment environment)
4550
else
4651
converted.Add(statement);
4752
}
48-
ConvertedStatementList = new StatementList(MetaData, converted.ToArray());
53+
ConvertedStatementList = new StatementList(MetaData);
4954
}
5055

5156
public override IEnumerable<ReturnStatement> FindReturnStatements() =>

CmcExec/Executable.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ private static void TestOk() => Gen.RunLlvm(
1818
new VariableDeclaration(MetaData.Empty,
1919
"main", new LambdaExpression(MetaData.Empty,
2020
new StatementList(MetaData.Empty,
21-
new VariableDeclaration(MetaData.Empty,
22-
"j", new StringLiteralExpression(MetaData.Empty, "Hello, World")),
2321
new ExpressionStatement(MetaData.Empty,
2422
new FunctionCallExpression(MetaData.Empty,
2523
new VariableExpression(MetaData.Empty, "print"),

CmcTest/FunctionCallTests.cs

Lines changed: 5 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,14 @@ public class FunctionCallTests
2020
public static VariableDeclaration IdDeclaration() =>
2121
new VariableDeclaration(MetaData.Empty, "id",
2222
new LambdaExpression(MetaData.Empty,
23-
new StatementList(MetaData.Empty,
24-
new ReturnStatement(MetaData.Empty,
25-
new VariableExpression(MetaData.Empty, "a"))),
23+
new StatementList(MetaData.Empty),
2624
new List<VariableDeclaration>(new[]
2725
{
2826
new VariableDeclaration(MetaData.Empty, "a", type:
2927
new UnknownType(MetaData.Empty, "i8"))
3028
})));
3129

3230
public static StatementList FuncCallAst1() => new StatementList(MetaData.Empty,
33-
IdDeclaration(),
3431
new VariableDeclaration(MetaData.Empty, "gg", type:
3532
new UnknownType(MetaData.Empty, "i8")),
3633
new AssignmentStatement(MetaData.Empty,
@@ -40,7 +37,6 @@ public static VariableDeclaration IdDeclaration() =>
4037
new List<Expression>(new[] {new IntLiteralExpression(MetaData.Empty, "1", true)}))));
4138

4239
public static StatementList FuncCallAst2() => new StatementList(MetaData.Empty,
43-
IdDeclaration(),
4440
new VariableDeclaration(MetaData.Empty, "gg", isMutable: true, type:
4541
new UnknownType(MetaData.Empty, "i8")),
4642
new AssignmentStatement(MetaData.Empty,
@@ -50,23 +46,14 @@ public static VariableDeclaration IdDeclaration() =>
5046
new List<Expression>(new[] {new IntLiteralExpression(MetaData.Empty, "233", true, 8)}))));
5147

5248
public static LambdaExpression LambdaAst1() => new LambdaExpression(MetaData.Empty,
53-
new StatementList(MetaData.Empty,
54-
new ReturnStatement(MetaData.Empty,
55-
new FunctionCallExpression(MetaData.Empty,
56-
new VariableExpression(MetaData.Empty, "recur"),
57-
new List<Expression>(new[]
58-
{
59-
new VariableExpression(MetaData.Empty, "a")
60-
})))),
49+
new StatementList(MetaData.Empty),
6150
new List<VariableDeclaration>(new[]
6251
{
6352
new VariableDeclaration(MetaData.Empty, "a", type:
6453
new UnknownType(MetaData.Empty, "i8"))
6554
}));
6655

6756
public static StatementList FuncCallAst3() => new StatementList(MetaData.Empty,
68-
new VariableDeclaration(MetaData.Empty, "recurFunc",
69-
LambdaAst1()),
7057
new VariableDeclaration(MetaData.Empty, "gg", isMutable: true, type:
7158
new UnknownType(MetaData.Empty, "i8")),
7259
new AssignmentStatement(MetaData.Empty,
@@ -79,23 +66,14 @@ public static VariableDeclaration IdDeclaration() =>
7966
}))));
8067

8168
public static LambdaExpression LambdaAst2() => new LambdaExpression(MetaData.Empty,
82-
new StatementList(MetaData.Empty,
83-
new ReturnStatement(MetaData.Empty,
84-
new FunctionCallExpression(MetaData.Empty,
85-
new VariableExpression(MetaData.Empty, "recur"),
86-
new List<Expression>(new[]
87-
{
88-
new VariableExpression(MetaData.Empty, "a")
89-
})))),
69+
new StatementList(MetaData.Empty),
9070
new List<VariableDeclaration>(new[]
9171
{
9272
new VariableDeclaration(MetaData.Empty, "a", type:
9373
new UnknownType(MetaData.Empty, "i8"))
9474
}), new UnknownType(MetaData.Empty, "i8"));
9575

9676
public static StatementList FuncCallAst4() => new StatementList(MetaData.Empty,
97-
new VariableDeclaration(MetaData.Empty, "recurFunc",
98-
LambdaAst2()),
9977
new VariableDeclaration(MetaData.Empty, "gg", isMutable: true, type:
10078
new UnknownType(MetaData.Empty, "i8")),
10179
new AssignmentStatement(MetaData.Empty,
@@ -108,30 +86,14 @@ public static VariableDeclaration IdDeclaration() =>
10886
}))));
10987

11088
public static LambdaExpression LambdaAst3() => new LambdaExpression(MetaData.Empty,
111-
new StatementList(MetaData.Empty,
112-
new ReturnStatement(MetaData.Empty,
113-
new FunctionCallExpression(MetaData.Empty,
114-
new LambdaExpression(MetaData.Empty,
115-
new StatementList(MetaData.Empty,
116-
new ReturnStatement(MetaData.Empty,
117-
new FunctionCallExpression(MetaData.Empty,
118-
new VariableExpression(MetaData.Empty, "recur"),
119-
new List<Expression>(new[]
120-
{
121-
new VariableExpression(MetaData.Empty, "a")
122-
})))
123-
), returnType:
124-
new UnknownType(MetaData.Empty, "i8")),
125-
new List<Expression>()))),
89+
new StatementList(MetaData.Empty),
12690
new List<VariableDeclaration>(new[]
12791
{
12892
new VariableDeclaration(MetaData.Empty, "a", type:
12993
new UnknownType(MetaData.Empty, "i8"))
13094
}), new UnknownType(MetaData.Empty, "i8"));
13195

13296
public static StatementList FuncCallAst5() => new StatementList(MetaData.Empty,
133-
new VariableDeclaration(MetaData.Empty, "recurFunc",
134-
LambdaAst3()),
13597
new VariableDeclaration(MetaData.Empty, "gg", isMutable: true, type:
13698
new UnknownType(MetaData.Empty, "i8")),
13799
new AssignmentStatement(MetaData.Empty,
@@ -230,9 +192,7 @@ private static void ExpressionSplittingTestCore(IntLiteralExpression parameter,
230192
}));
231193
var core = new Core();
232194
var lambdaExpression = new LambdaExpression(MetaData.Empty,
233-
new StatementList(MetaData.Empty,
234-
new ReturnStatement(MetaData.Empty,
235-
expr)));
195+
new StatementList(MetaData.Empty));
236196
core.Analyze(
237197
IdDeclaration(),
238198
new VariableDeclaration(MetaData.Empty, "_", lambdaExpression));

CmcTest/ReturnTests.cs

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using Cmc;
22
using Cmc.Core;
3-
using Cmc.Decl;
43
using Cmc.Expr;
54
using Cmc.Stmt;
65
using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -14,29 +13,17 @@ public class ReturnTests
1413

1514
public static LambdaExpression Block2() => new LambdaExpression(MetaData.Empty,
1615
new StatementList(MetaData.Empty,
17-
new VariableDeclaration(MetaData.Empty, Var,
18-
new BoolLiteralExpression(MetaData.Empty, false)),
1916
new IfStatement(MetaData.Empty,
2017
new VariableExpression(MetaData.Empty, Var),
21-
new StatementList(MetaData.Empty,
22-
new ReturnStatement(MetaData.Empty,
23-
new IntLiteralExpression(MetaData.Empty, "23", false, 8))),
24-
new StatementList(MetaData.Empty,
25-
new ReturnStatement(MetaData.Empty,
26-
new IntLiteralExpression(MetaData.Empty, "45", false, 8))))));
18+
new StatementList(MetaData.Empty),
19+
new StatementList(MetaData.Empty))));
2720

2821
public static LambdaExpression Block1() => new LambdaExpression(MetaData.Empty,
2922
new StatementList(MetaData.Empty,
30-
new VariableDeclaration(MetaData.Empty, Var,
31-
new BoolLiteralExpression(MetaData.Empty, false)),
3223
new IfStatement(MetaData.Empty,
3324
new VariableExpression(MetaData.Empty, Var),
34-
new StatementList(MetaData.Empty,
35-
new ReturnStatement(MetaData.Empty,
36-
new IntLiteralExpression(MetaData.Empty, "0", false, 8))),
37-
new StatementList(MetaData.Empty,
38-
new ReturnStatement(MetaData.Empty,
39-
new IntLiteralExpression(MetaData.Empty, "1", true, 8))))));
25+
new StatementList(MetaData.Empty),
26+
new StatementList(MetaData.Empty))));
4027

4128
[TestInitialize]
4229
public void Init() => Errors.ErrList.Clear();

CmcTest/StatementTests.cs

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using Cmc;
33
using Cmc.Core;
4-
using Cmc.Decl;
54
using Cmc.Expr;
65
using Cmc.Stmt;
76
using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -23,7 +22,6 @@ public void StatementTest1()
2322
{
2423
foreach (var stmt in
2524
new StatementList(MetaData.Empty,
26-
new Statement(MetaData.Empty),
2725
new Statement(MetaData.Empty)).Statements)
2826
stmt.PrintDumpInfo();
2927
}
@@ -64,14 +62,9 @@ public void StatementTest3()
6462
{
6563
const string var1 = "variableOne";
6664
var stmt = new StatementList(MetaData.Empty,
67-
new VariableDeclaration(MetaData.Empty, var1,
68-
new BoolLiteralExpression(MetaData.Empty, true)),
6965
new WhileStatement(MetaData.Empty,
7066
new VariableExpression(MetaData.Empty, var1),
71-
new StatementList(MetaData.Empty,
72-
new AssignmentStatement(MetaData.Empty,
73-
new VariableExpression(MetaData.Empty, var1),
74-
new BoolLiteralExpression(MetaData.Empty, false)))));
67+
new StatementList(MetaData.Empty)));
7568
stmt.SurroundWith(Environment.SolarSystem);
7669
stmt.PrintDumpInfo();
7770
Assert.IsTrue(0 != Errors.ErrList.Count);
@@ -86,14 +79,9 @@ public void StatementTest4()
8679
{
8780
const string var1 = "variableOne";
8881
var stmt = new StatementList(MetaData.Empty,
89-
new VariableDeclaration(MetaData.Empty, var1,
90-
new BoolLiteralExpression(MetaData.Empty, true), true),
9182
new WhileStatement(MetaData.Empty,
9283
new VariableExpression(MetaData.Empty, var1),
93-
new StatementList(MetaData.Empty,
94-
new AssignmentStatement(MetaData.Empty,
95-
new VariableExpression(MetaData.Empty, var1),
96-
new BoolLiteralExpression(MetaData.Empty, false)))));
84+
new StatementList(MetaData.Empty)));
9785
stmt.SurroundWith(Environment.SolarSystem);
9886
stmt.PrintDumpInfo();
9987
Assert.IsTrue(0 == Errors.ErrList.Count);
@@ -107,14 +95,9 @@ public void StatementTest5()
10795
{
10896
const string var1 = "variableOne";
10997
var stmt = new StatementList(MetaData.Empty,
110-
new VariableDeclaration(MetaData.Empty, var1,
111-
new BoolLiteralExpression(MetaData.Empty, true), true),
11298
new WhileStatement(MetaData.Empty,
11399
new VariableExpression(MetaData.Empty, var1),
114-
new StatementList(MetaData.Empty,
115-
new AssignmentStatement(MetaData.Empty,
116-
new VariableExpression(MetaData.Empty, var1),
117-
new NullExpression(MetaData.Empty)))));
100+
new StatementList(MetaData.Empty)));
118101
stmt.SurroundWith(Environment.SolarSystem);
119102
stmt.PrintDumpInfo();
120103
Assert.IsTrue(0 == Errors.ErrList.Count);
@@ -128,14 +111,9 @@ public void StatementTest6()
128111
{
129112
const string var1 = "variableOne";
130113
var stmt = new StatementList(MetaData.Empty,
131-
new VariableDeclaration(MetaData.Empty, var1,
132-
new BoolLiteralExpression(MetaData.Empty, true), true),
133114
new WhileStatement(MetaData.Empty,
134115
new VariableExpression(MetaData.Empty, var1),
135-
new StatementList(MetaData.Empty,
136-
new AssignmentStatement(MetaData.Empty,
137-
new VariableExpression(MetaData.Empty, var1),
138-
new IntLiteralExpression(MetaData.Empty, "123", true)))));
116+
new StatementList(MetaData.Empty)));
139117
stmt.SurroundWith(Environment.SolarSystem);
140118
stmt.PrintDumpInfo();
141119
Assert.IsTrue(0 != Errors.ErrList.Count);

0 commit comments

Comments
 (0)