Skip to content

Commit a1fd3a1

Browse files
committed
Merge remote-tracking branch 'origin/isac'
2 parents e067d32 + 8329588 commit a1fd3a1

22 files changed

+411
-94
lines changed

src/CodeGenerator/CodeGenerator.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,8 @@
1111
import java.io.File;
1212
import java.io.FileWriter;
1313
import java.io.IOException;
14-
import java.util.ArrayList;
15-
import java.util.HashMap;
16-
import java.util.HashSet;
17-
import java.util.LinkedHashMap;
14+
import java.util.*;
15+
import java.util.concurrent.TimeUnit;
1816

1917

2018
public class CodeGenerator {
@@ -123,11 +121,10 @@ public static void main(String[] args) {
123121
* @see Syntax.Unary
124122
* @see Syntax.Binary
125123
*/
126-
public static void addLink(String operator) {
124+
public static void addOperatorLink(String operator) {
127125
switch (operator) {
128126
case Operator.TIME_PLUS:
129127
case Operator.TIME_PLUS_ASSIGN:
130-
System.out.println("in");
131128
needToLinkFunction.add("addTime");
132129
needToLinkFunction.add("validTime");
133130
break;
@@ -159,21 +156,31 @@ public static void addLink(String operator) {
159156
case Operator.DATE_PLUS:
160157
case Operator.DATE_PLUS_ASSIGN:
161158
needToLinkFunction.add("addDate");
162-
needToLinkFunction.add("validDate");
163159
break;
164160
case Operator.DATE_MINUS:
165161
case Operator.DATE_MINUS_ASSIGN:
166162
needToLinkFunction.add("subDate");
167-
needToLinkFunction.add("validDate");
168163
break;
169164
case Operator.DATE_PP:
170165
case Operator.DATE_MM:
171-
needToLinkFunction.add("validDate");
166+
needToLinkFunction.add("addDate");
172167
break;
173168
}
174169
}
175170

176171

172+
/**
173+
* TTime언어 에서는 존재하지만, U-code에서 존재하지 않는 함수들을 사용한다면,
174+
* 이 메소드를 code generating전에 호출해서 등록 해야만 U-code로 변환된 결과파일에 그 함수를 Link할 수 있다.
175+
*
176+
* @param functionName Link할 함수 이름
177+
* @see Syntax.Function
178+
*/
179+
public static void addFunctionLink(String functionName) {
180+
needToLinkFunction.add(functionName);
181+
}
182+
183+
177184
/******************************************************
178185
* 파일에 U-code를 직접 쓰기위해 사용되는 함수들.
179186
* <p>
@@ -201,7 +208,7 @@ protected static void genCode(String instr, int... args) {
201208
result.append('\t');
202209

203210
for (int arg : args) {
204-
result.append(' ').append(arg);
211+
result.append(arg).append(' ');
205212
}
206213
}
207214
result.append("\r\n");
@@ -425,8 +432,8 @@ public static void sub() {
425432
genCode("sub");
426433
}
427434

428-
public static void multi() {
429-
genCode("multi");
435+
public static void mult() {
436+
genCode("mult");
430437
}
431438

432439
public static void div() {

src/CodeGenerator/DefinedFunction.java

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@
88
import Syntax.Type;
99

1010
import java.lang.reflect.InvocationTargetException;
11-
import java.util.ArrayList;
12-
import java.util.Arrays;
13-
import java.util.Collections;
14-
import java.util.HashMap;
11+
import java.util.*;
1512

1613
public class DefinedFunction {
1714
private static final ParamDeclaration intParam = new ParamDeclaration(Type.INT, "dummy");
@@ -20,15 +17,24 @@ public class DefinedFunction {
2017
private static final ParamDeclaration charParam = new ParamDeclaration(Type.CHAR, "dummy");
2118
private static final ParamDeclaration dateParam = new ParamDeclaration(Type.DATE, "dummy");
2219
private static final ParamDeclaration timeParam = new ParamDeclaration(Type.TIME, "dummy");
20+
2321
private static FunctionSet functionSet;
2422
private static HashMap<String, ArrayList<FunctionInfo>> overloadMap;
2523

26-
public static final ArrayList<String> predefinedFunc = new ArrayList<>(Arrays.asList(
27-
"write", "read", "lf", "getHour", "getMin", "getSec", "getYear", "getMonth", "getDay",
28-
"addTime", "addDate", "subTime", "subDate", "mulTime", "divTime", "modTime",
29-
"validTime", "validDate",
30-
"addFloat", "subFloat", "mulFloat", "divFloat", "modFloat"
31-
));
24+
private static final String[] UCodeFunction = {
25+
"write", "read", "lf", "addFloat", "subFloat",
26+
"mulFloat", "divFloat", "modFloat", "negFloat", "F2I", "I2F",
27+
"writeF", "writeC", "writeT", "writeD"
28+
};
29+
30+
private static final String[] customFunc = {
31+
"getHour", "getMin", "getSec", "getYear", "getMonth", "getDay",
32+
"addTime", "subTime", "mulTime", "divTime", "modTime",
33+
"addDate", "subDate",
34+
"validTime"
35+
};
36+
37+
public static final HashSet<String> predefinedFunc = new HashSet<>(Arrays.asList(customFunc));
3238

3339
public static void defineFunc(FunctionSet functionSet, HashMap<String, ArrayList<FunctionInfo>> overloadMap) {
3440
DefinedFunction.functionSet = functionSet;
@@ -39,16 +45,17 @@ public static void defineFunc(FunctionSet functionSet, HashMap<String, ArrayList
3945
createFunc(Type.VOID, "write", charParam);
4046
createFunc(Type.VOID, "write", dateParam);
4147
createFunc(Type.VOID, "write", timeParam);
48+
createFunc(Type.VOID, "write", floatParam);
4249
createFunc(Type.INT, "read", intParam);
4350
createFunc(Type.VOID, "lf");
44-
51+
4552
createFunc(Type.INT, "getHour", timeParam);
4653
createFunc(Type.INT, "getMin", timeParam);
4754
createFunc(Type.INT, "getSec", timeParam);
4855
createFunc(Type.INT, "getYear", dateParam);
4956
createFunc(Type.INT, "getMonth", dateParam);
5057
createFunc(Type.INT, "getDay", dateParam);
51-
58+
5259
createFunc(Type.TIME, "addTime", timeParam, timeParam);
5360
createFunc(Type.TIME, "subTime", timeParam, timeParam);
5461
createFunc(Type.TIME, "mulTime", timeParam, intParam);
@@ -58,7 +65,6 @@ public static void defineFunc(FunctionSet functionSet, HashMap<String, ArrayList
5865

5966
createFunc(Type.DATE, "addDate", dateParam, dateParam);
6067
createFunc(Type.DATE, "subDate", dateParam, dateParam);
61-
createFunc(Type.DATE, "validDate", dateParam);
6268
}
6369

6470
private static void createFunc(Type type, String name, ParamDeclaration... params) {
@@ -190,7 +196,7 @@ protected static void mulTime() {
190196
CodeGenerator.genCode("ldp");
191197
CodeGenerator.genCode("lod", 2, 1);
192198
CodeGenerator.genCode("lod", 2, 2);
193-
CodeGenerator.genCode("multi");
199+
CodeGenerator.genCode("mult");
194200
CodeGenerator.call("validTime");
195201

196202
CodeGenerator.genCode("retv");
@@ -244,18 +250,28 @@ protected static void validTime() {
244250

245251
protected static void addDate() {
246252
// todo
247-
}
253+
CodeGenerator.genFunc("addDate", 2, 2, 2);
254+
CodeGenerator.genCode("sym", 2, 1, 1);
255+
CodeGenerator.genCode("sym", 2, 2, 1);
248256

249-
protected static void subDate() {
250-
// todo
257+
CodeGenerator.genCode("lod", 2, 1);
258+
CodeGenerator.genCode("lod", 2, 2);
259+
CodeGenerator.genCode("add");
260+
261+
CodeGenerator.call("validDate");
262+
263+
CodeGenerator.genCode("end");
251264
}
252265

253-
protected static void validDate() {
266+
protected static void subDate() {
254267
// todo
255-
CodeGenerator.genFunc("validDate", 1, 2, 2);
268+
CodeGenerator.genFunc("addDate", 2, 2, 2);
256269
CodeGenerator.genCode("sym", 2, 1, 1);
270+
CodeGenerator.genCode("sym", 2, 2, 1);
257271

258272
CodeGenerator.genCode("lod", 2, 1);
273+
CodeGenerator.genCode("lod", 2, 2);
274+
CodeGenerator.genCode("sub");
259275

260276
CodeGenerator.genCode("retv");
261277
CodeGenerator.genCode("end");

src/Lexer/Lexer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,7 @@ public Token next() {
161161
ch = nextChar();
162162
return Token.semicolonTok;
163163
case '&':
164-
check('&');
165-
return Token.andTok;
164+
return chkOpt('&', Token.refTok, Token.andTok);
166165
case '|':
167166
check('|');
168167
return Token.orTok;

src/Parser/Parser.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,9 @@ private boolean isAssignOp() {
677677

678678
private boolean isUnaryOp() {
679679
return token.type().equals(TokenType.Not)
680-
|| token.type().equals(TokenType.Minus);
680+
|| token.type().equals(TokenType.Minus)
681+
|| token.type().equals(TokenType.Multiply)
682+
|| token.type().equals(TokenType.Ref);
681683
}
682684

683685
private boolean isEqualityOp() {

0 commit comments

Comments
 (0)