-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCompiler.java
131 lines (118 loc) · 5.37 KB
/
Compiler.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import java.util.*;
import java.io.*;
class Compiler {
public static void main(String args[]) {
try {
// defining variables and arrays
double version = 1.0;
boolean inmain;
String[][] functions;
variables[] vars;
int fun_x = 0;
int fun_y = 0;
int var_x = 0;
// if user enters help command
if (args[0].equals("--help")) {
System.out.println("java Compiler.java [Shock_File_Name] : runs Shock files");
System.out.println("java Compiler.java --help : list of commands");
System.out.println("java Compiler.java --version : find current Shock version");
System.exit(0);
// if user enters version command
} else if (args[0].equals("--version")) {
System.out.print("Shock ");
System.out.print(version);
System.out.println(" Beta");
System.exit(0);
}
// if neither, then the user must have entered the file they want compiled
// initializing shock file and Reader
String file_name = args[0];
File file = new File(file_name);
Scanner Reader = new Scanner(file);
// initializing data (String that holds each line of Shock code)
// initializing line (integer that keeps track of the line the reader is on)
int line = 0;
String data = null;
do {
if (Reader.hasNext() == false) {
break;
}
do {
line++;
data = read(data, line, Reader);
} while (data.equals(""));
// initializing array to hold a split version of the line currently being analized
String[] data_list = data.split(" ");
// code for if the first line of code is an import statement
if (data_list[0] == "import") {
// code for if the first line of code is the initialization of a variable or a function
} else if (data_list[0] == "int" || data_list[0] == "float" || data_list[0] == "String" || data_list[0] == "Boolean") {
// check if it is a function
List<String> Data_List = Arrays.asList(data_list);
if (Data_List.contains("{")) {
// the code will save the name of the function and everything inside it to a 2d array called functions
String[] data2 = data_list[1].split("(");
functions[fun_x][fun_y] = data2[0];
fun_y++;
data = "{";
while (data != "}") {
if (data != "{") {
functions[fun_x][fun_y] = data;
fun_y++;
}
data = read(data, line, Reader);
line++;
}
fun_x++;
// if it is a variable
} else {
if (data_list.length > 3 && data_list[2] == "=") {
switch (data_list[0]) {
case "int":
vars[var_x] = new integer();
vars[var_x].name = data_list[1];
vars[var_x].value = Integer.parseInt(data_list[3]);
break;
case "String":
vars[var_x] = new string();
vars[var_x].name = data_list[1];
vars[var_x].value = data_list[3];
break;
case "float":
vars[var_x] = new Float();
vars[var_x].name = data_list[1];
vars[var_x].value = Float.parseFloat(data_list[3]);
break;
case "bool":
vars[var_x] = new Bool();
vars[var_x].name = data_list[1];
vars[var_x].value = Boolean.parseBoolean(data_list[3]);
break;
}
} else {
error(line, data, "expected '='");
}
}
}
} while(Reader.hasNextLine());
Reader.close();
} catch (Error e) {
//System.out.println(e);
} catch (Exception E) {
//System.out.println(E);
}
}
public static String read(String data, int line, Scanner Reader) {
data = Reader.nextLine();
return data;
}
public static void error(int line, String data, String reason) {
System.out.print("Error: on line ");
System.out.println(line);
System.out.print(" ");
System.out.println(data);
System.out.print("\n");
System.out.println(reason);
System.exit(0);
}
}