Skip to content

Commit 39a5985

Browse files
committed
BASIC AST TESTS ARE WORKING!
1 parent f2a2a76 commit 39a5985

49 files changed

Lines changed: 970 additions & 137 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.idea/workspace.xml

Lines changed: 90 additions & 26 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/java/ko/carbonel/compiler/config/ArgumentName.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@ public enum ArgumentName {
1919
ALL_OPTIONS,
2020
IDE_OFFSET_FIX,
2121
TARGET,
22-
CHECK_EXPRESSIONS
22+
CHECK_EXPRESSIONS,
23+
W_UNUSED_RETURN
2324
}

src/main/java/ko/carbonel/compiler/config/Config.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public class Config {
4848
addArgument(new Flag(ArgumentName.ALL_OPTIONS, "Output all options during syntax error", false));
4949
addArgument(new Flag(ArgumentName.IDE_OFFSET_FIX, "Add 1 to error line and column for IDE direct link", false));
5050
addArgument(new Flag(ArgumentName.CHECK_EXPRESSIONS, "Check that the expressions are correct", true));
51+
addArgument(new Flag(ArgumentName.W_UNUSED_RETURN, "Warn unused expression values", false));
5152
addArgument(new FileArgument(ArgumentName.INPUT_RS_FILE, "Input tinyRust+ file", List.of(".rs"), true, true, ""));
5253
addArgument(new FileArgument(ArgumentName.INPUT_GRAMMAR_FILE, "Grammar file", List.of(".syn", ".bnf"), false, true, ""));
5354
addArgument(new FileArgument(ArgumentName.OUTPUT_ASM_FILE, "Output MIPS file", List.of(".asm"), false, false, ""));
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package ko.carbonel.compiler.exception.semantic;
2+
3+
import ko.carbonel.compiler.stream.reader.FileLocation;
4+
5+
public class ExpressionError extends SemanticError {
6+
public ExpressionError(FileLocation start, String message) {
7+
super(start, message);
8+
}
9+
10+
public ExpressionError(FileLocation start, FileLocation end, String message) {
11+
super(start, end, message);
12+
}
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package ko.carbonel.compiler.exception.semantic;
2+
3+
import ko.carbonel.compiler.stream.reader.FileLocation;
4+
5+
public class IncompatibleTypesError extends ExpressionError {
6+
public IncompatibleTypesError(FileLocation start, String message) {
7+
super(start, message);
8+
}
9+
10+
public IncompatibleTypesError(FileLocation start, FileLocation end, String message) {
11+
super(start, end, message);
12+
}
13+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package ko.carbonel.compiler.exception.semantic;
2+
3+
import ko.carbonel.compiler.stream.reader.FileLocation;
4+
5+
public class MissingReturnStatementError extends ExpressionError {
6+
public MissingReturnStatementError(FileLocation start, String message) {
7+
super(start, message);
8+
}
9+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package ko.carbonel.compiler.exception.semantic;
2+
3+
import ko.carbonel.compiler.stream.reader.FileLocation;
4+
5+
public class WrongArgumentTypeError extends ExpressionError {
6+
public WrongArgumentTypeError(FileLocation start, String message) {
7+
super(start, message);
8+
}
9+
10+
public WrongArgumentTypeError(FileLocation start, FileLocation end, String message) {
11+
super(start, end, message);
12+
}
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package ko.carbonel.compiler.exception.semantic;
2+
3+
import ko.carbonel.compiler.stream.reader.FileLocation;
4+
5+
public class WrongNumberOfArgumentsError extends ExpressionError {
6+
public WrongNumberOfArgumentsError(FileLocation start, String message) {
7+
super(start, message);
8+
}
9+
10+
public WrongNumberOfArgumentsError(FileLocation start, FileLocation end, String message) {
11+
super(start, end, message);
12+
}
13+
}

src/main/java/ko/carbonel/compiler/generated/AttrTinyRustParser.java

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ private List<TinyRustLexerToken> matchToken_BraceExp(){
164164
return result;
165165
}
166166

167-
private List<TinyRustLexerToken> matchToken_Chain_factored_factored(){
168-
enter("matchToken_Chain_factored_factored");
167+
private List<TinyRustLexerToken> matchToken_Chain_factored_factored1(){
168+
enter("matchToken_Chain_factored_factored1");
169169
List<TinyRustLexerToken> result = null;
170170
if (peek(TinyRustTokenType.OPN_PAREN)){
171171
st.expMethodCall();
@@ -175,6 +175,23 @@ private List<TinyRustLexerToken> matchToken_Chain_factored_factored(){
175175
List<TinyRustLexerToken> v_4 = matchToken_StaticMethodCall_factored();
176176
} else if (peek(TinyRustTokenType.AND, TinyRustTokenType.CLS_BRACK, TinyRustTokenType.CLS_PAREN, TinyRustTokenType.COMMA, TinyRustTokenType.DIVIDE, TinyRustTokenType.DOT, TinyRustTokenType.EQ, TinyRustTokenType.GEQ, TinyRustTokenType.GT, TinyRustTokenType.LEQ, TinyRustTokenType.LT, TinyRustTokenType.MINUS, TinyRustTokenType.MOD, TinyRustTokenType.NEQ, TinyRustTokenType.OPN_BRACK, TinyRustTokenType.OR, TinyRustTokenType.PLUS, TinyRustTokenType.SEMI_COLON, TinyRustTokenType.TIMES)){
177177
List<TinyRustLexerToken> v_0 = matchToken_Var_factored();
178+
} else {
179+
handleUnexpectedToken("ChainFF1", Set.of(TinyRustTokenType.AND, TinyRustTokenType.CLS_BRACK, TinyRustTokenType.CLS_PAREN, TinyRustTokenType.COMMA, TinyRustTokenType.DIVIDE, TinyRustTokenType.DOT, TinyRustTokenType.EQ, TinyRustTokenType.GEQ, TinyRustTokenType.GT, TinyRustTokenType.LEQ, TinyRustTokenType.LT, TinyRustTokenType.MINUS, TinyRustTokenType.MOD, TinyRustTokenType.NEQ, TinyRustTokenType.OPN_BRACK, TinyRustTokenType.OPN_PAREN, TinyRustTokenType.OR, TinyRustTokenType.PLUS, TinyRustTokenType.SEMI_COLON, TinyRustTokenType.TIMES));
180+
}
181+
exit("matchToken_Chain_factored_factored1");
182+
return result;
183+
}
184+
185+
private List<TinyRustLexerToken> matchToken_Chain_factored_factored(){
186+
enter("matchToken_Chain_factored_factored");
187+
List<TinyRustLexerToken> result = null;
188+
if (peek(TinyRustTokenType.OPN_PAREN)){
189+
st.expMethodCall();
190+
List<TinyRustLexerToken> v_1 = matchToken_Args();
191+
st.endMethodCall();
192+
List<TinyRustLexerToken> v_3 = matchToken_StaticMethodCall_factored();
193+
} else if (peek(TinyRustTokenType.AND, TinyRustTokenType.CLS_BRACK, TinyRustTokenType.CLS_PAREN, TinyRustTokenType.COMMA, TinyRustTokenType.DIVIDE, TinyRustTokenType.DOT, TinyRustTokenType.EQ, TinyRustTokenType.GEQ, TinyRustTokenType.GT, TinyRustTokenType.LEQ, TinyRustTokenType.LT, TinyRustTokenType.MINUS, TinyRustTokenType.MOD, TinyRustTokenType.NEQ, TinyRustTokenType.OPN_BRACK, TinyRustTokenType.OR, TinyRustTokenType.PLUS, TinyRustTokenType.SEMI_COLON, TinyRustTokenType.TIMES)){
194+
List<TinyRustLexerToken> v_0 = matchToken_Var_factored();
178195
} else {
179196
handleUnexpectedToken("ChainFF", Set.of(TinyRustTokenType.AND, TinyRustTokenType.CLS_BRACK, TinyRustTokenType.CLS_PAREN, TinyRustTokenType.COMMA, TinyRustTokenType.DIVIDE, TinyRustTokenType.DOT, TinyRustTokenType.EQ, TinyRustTokenType.GEQ, TinyRustTokenType.GT, TinyRustTokenType.LEQ, TinyRustTokenType.LT, TinyRustTokenType.MINUS, TinyRustTokenType.MOD, TinyRustTokenType.NEQ, TinyRustTokenType.OPN_BRACK, TinyRustTokenType.OPN_PAREN, TinyRustTokenType.OR, TinyRustTokenType.PLUS, TinyRustTokenType.SEMI_COLON, TinyRustTokenType.TIMES));
180197
}
@@ -189,7 +206,7 @@ private List<TinyRustLexerToken> matchToken_Chain(){
189206
TinyRustLexerToken v_0 = match(TinyRustTokenType.DOT);
190207
TinyRustLexerToken v_1 = match(TinyRustTokenType.ATTR_ID);
191208
st.expChainWith(v_1);
192-
List<TinyRustLexerToken> v_3 = matchToken_Chain_factored_factored();
209+
List<TinyRustLexerToken> v_3 = matchToken_Chain_factored_factored1();
193210
} else {
194211
handleUnexpectedToken("Chain", Set.of(TinyRustTokenType.DOT));
195212
}
@@ -758,7 +775,7 @@ private List<TinyRustLexerToken> matchToken_NewCall_factored_factored(){
758775
List<TinyRustLexerToken> result = null;
759776
if (peek(TinyRustTokenType.CLASS_ID)){
760777
TinyRustLexerToken v_0 = match(TinyRustTokenType.CLASS_ID);
761-
st.expField(v_0);
778+
st.expClassRef(v_0);
762779
st.expConstructorCall();
763780
List<TinyRustLexerToken> v_3 = matchToken_Args();
764781
st.expNewClass();
@@ -1190,10 +1207,9 @@ private List<TinyRustLexerToken> matchToken_Stmt_star(){
11901207
private List<TinyRustLexerToken> matchToken_Stmt(){
11911208
enter("matchToken_Stmt");
11921209
List<TinyRustLexerToken> result = null;
1193-
if (peek(TinyRustTokenType.ATTR_ID, TinyRustTokenType.SELF)){
1194-
st.newAssign();
1195-
List<TinyRustLexerToken> v_1 = matchToken_Assign();
1196-
TinyRustLexerToken v_2 = match(TinyRustTokenType.SEMI_COLON);
1210+
if (peek(TinyRustTokenType.SEMI_COLON)){
1211+
st.newEmpty();
1212+
TinyRustLexerToken v_1 = match(TinyRustTokenType.SEMI_COLON);
11971213
} else if (peek(TinyRustTokenType.WHILE)){
11981214
st.newWhile();
11991215
TinyRustLexerToken v_1 = match(TinyRustTokenType.WHILE);
@@ -1203,15 +1219,6 @@ private List<TinyRustLexerToken> matchToken_Stmt(){
12031219
st.whileBody();
12041220
List<TinyRustLexerToken> v_6 = matchToken_Stmt();
12051221
st.endWhile();
1206-
} else if (peek(TinyRustTokenType.OPN_BRACE)){
1207-
st.newBlock();
1208-
TinyRustLexerToken v_1 = match(TinyRustTokenType.OPN_BRACE);
1209-
List<TinyRustLexerToken> v_2 = matchToken_Method_factored();
1210-
} else if (peek(TinyRustTokenType.RETURN)){
1211-
st.newReturn();
1212-
TinyRustLexerToken v_1 = match(TinyRustTokenType.RETURN);
1213-
List<TinyRustLexerToken> v_2 = matchToken_Stmt_factored();
1214-
st.endReturn();
12151222
} else if (peek(TinyRustTokenType.IF)){
12161223
st.newIf();
12171224
TinyRustLexerToken v_1 = match(TinyRustTokenType.IF);
@@ -1222,16 +1229,26 @@ private List<TinyRustLexerToken> matchToken_Stmt(){
12221229
List<TinyRustLexerToken> v_6 = matchToken_Stmt();
12231230
List<TinyRustLexerToken> v_7 = matchToken_Stmt_factored_factored_factored();
12241231
st.ifEnd();
1232+
} else if (peek(TinyRustTokenType.OPN_BRACE)){
1233+
st.newBlock();
1234+
TinyRustLexerToken v_1 = match(TinyRustTokenType.OPN_BRACE);
1235+
List<TinyRustLexerToken> v_2 = matchToken_Method_factored();
1236+
} else if (peek(TinyRustTokenType.ATTR_ID, TinyRustTokenType.SELF)){
1237+
st.newAssign();
1238+
List<TinyRustLexerToken> v_1 = matchToken_Assign();
1239+
TinyRustLexerToken v_2 = match(TinyRustTokenType.SEMI_COLON);
12251240
} else if (peek(TinyRustTokenType.OPN_PAREN)){
12261241
st.newExpr();
12271242
TinyRustLexerToken v_1 = match(TinyRustTokenType.OPN_PAREN);
12281243
List<TinyRustLexerToken> v_2 = matchToken_ExpOr();
12291244
TinyRustLexerToken v_3 = match(TinyRustTokenType.CLS_PAREN);
12301245
TinyRustLexerToken v_4 = match(TinyRustTokenType.SEMI_COLON);
12311246
st.endExpr();
1232-
} else if (peek(TinyRustTokenType.SEMI_COLON)){
1233-
st.newEmpty();
1234-
TinyRustLexerToken v_1 = match(TinyRustTokenType.SEMI_COLON);
1247+
} else if (peek(TinyRustTokenType.RETURN)){
1248+
st.newReturn();
1249+
TinyRustLexerToken v_1 = match(TinyRustTokenType.RETURN);
1250+
List<TinyRustLexerToken> v_2 = matchToken_Stmt_factored();
1251+
st.endReturn();
12351252
} else {
12361253
handleUnexpectedToken("Stmt", Set.of(TinyRustTokenType.ATTR_ID, TinyRustTokenType.IF, TinyRustTokenType.OPN_BRACE, TinyRustTokenType.OPN_PAREN, TinyRustTokenType.RETURN, TinyRustTokenType.SELF, TinyRustTokenType.SEMI_COLON, TinyRustTokenType.WHILE));
12371254
}
@@ -1314,13 +1331,15 @@ private List<TinyRustLexerToken> matchToken_program_factored_factored_factored_f
13141331
enter("matchToken_program_factored_factored_factored_factored");
13151332
List<TinyRustLexerToken> result = null;
13161333
if (peek(TinyRustTokenType.CLS_BRACE)){
1317-
TinyRustLexerToken v_0 = match(TinyRustTokenType.CLS_BRACE);
1334+
st.endBlock();
1335+
TinyRustLexerToken v_1 = match(TinyRustTokenType.CLS_BRACE);
13181336
} else if (peek(TinyRustTokenType.ARRAY, TinyRustTokenType.BOOL, TinyRustTokenType.CHR, TinyRustTokenType.CLASS_ID, TinyRustTokenType.INT, TinyRustTokenType.STR)){
13191337
List<TinyRustLexerToken> v_0 = matchToken_LocalVars_star();
13201338
List<TinyRustLexerToken> v_1 = matchToken_Method_factored();
13211339
} else if (peek(TinyRustTokenType.ATTR_ID, TinyRustTokenType.IF, TinyRustTokenType.OPN_BRACE, TinyRustTokenType.OPN_PAREN, TinyRustTokenType.RETURN, TinyRustTokenType.SELF, TinyRustTokenType.SEMI_COLON, TinyRustTokenType.WHILE)){
13221340
List<TinyRustLexerToken> v_0 = matchToken_Stmt_star();
1323-
TinyRustLexerToken v_1 = match(TinyRustTokenType.CLS_BRACE);
1341+
st.endBlock();
1342+
TinyRustLexerToken v_2 = match(TinyRustTokenType.CLS_BRACE);
13241343
} else {
13251344
handleUnexpectedToken("programFFFF", Set.of(TinyRustTokenType.ARRAY, TinyRustTokenType.ATTR_ID, TinyRustTokenType.BOOL, TinyRustTokenType.CHR, TinyRustTokenType.CLASS_ID, TinyRustTokenType.CLS_BRACE, TinyRustTokenType.IF, TinyRustTokenType.INT, TinyRustTokenType.OPN_BRACE, TinyRustTokenType.OPN_PAREN, TinyRustTokenType.RETURN, TinyRustTokenType.SELF, TinyRustTokenType.SEMI_COLON, TinyRustTokenType.STR, TinyRustTokenType.WHILE));
13261345
}

src/main/java/ko/carbonel/compiler/intermediate/SymbolTable.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22

33
public interface SymbolTable {
44
void consolidate();
5+
void checkExpressions();
56
}

0 commit comments

Comments
 (0)