Skip to content
Snippets Groups Projects
Verified Commit b1417736 authored by Recolic Keghart's avatar Recolic Keghart
Browse files

finished all expr. debugging expr, passing 4

parent f8393156
No related branches found
No related tags found
No related merge requests found
Pipeline #35 passed with warnings with stages
in 6 minutes and 15 seconds
...@@ -131,12 +131,17 @@ public class TypeChecker extends AbstractNodeAnalyzer<SymbolType> { ...@@ -131,12 +131,17 @@ public class TypeChecker extends AbstractNodeAnalyzer<SymbolType> {
if(left_type != ValueType.INT_TYPE && left_type != ValueType.STR_TYPE && ! left_type.isListType()) { if(left_type != ValueType.INT_TYPE && left_type != ValueType.STR_TYPE && ! left_type.isListType()) {
err(node, "Syntax Error: operand of + should be INT or STR or LIST"); err(node, "Syntax Error: operand of + should be INT or STR or LIST");
} }
// fallthrough // fallthrough: do left-right match check.
case "==": case "==":
case "!=": case "!=":
case "is": case "is":
if(node.left.getInferredType() != node.right.getInferredType()) { if(!left_type.equals(right_type)) {
err(node, "Syntax Error: binary operator operand type mismatch"); if(left_type.isListType() && right_type.isListType()) {
System.out.println("debug: left_type=" + left_type.toString() + ", right=" + right_type.toString());
left_type = new ListValueType(OBJECT_TYPE);
break; // list-type mismatch is OK. but you should return [Object]
}
err(node, "Syntax Error: binary operator operand type mismatch: left=" + left_type.toString() + ", right=" + right_type.toString());
} }
break; break;
default: default:
...@@ -244,6 +249,20 @@ public class TypeChecker extends AbstractNodeAnalyzer<SymbolType> { ...@@ -244,6 +249,20 @@ public class TypeChecker extends AbstractNodeAnalyzer<SymbolType> {
} }
} }
@Override
public SymbolType analyze(ListExpr node) {
SymbolType elementType = null;
for(Expr expr : node.elements) {
SymbolType this_type = expr.dispatch(this);
if(elementType == null)
elementType = this_type;
if(this_type != elementType)
err(node, "list elements must have the same type.");
}
ListValueType resultType = new ListValueType(elementType);
return node.setInferredType(resultType);
}
@Override @Override
public SymbolType analyze(MemberExpr node) { public SymbolType analyze(MemberExpr node) {
ClassValueType objType = (ClassValueType) node.object.dispatch(this); ClassValueType objType = (ClassValueType) node.object.dispatch(this);
...@@ -259,6 +278,23 @@ public class TypeChecker extends AbstractNodeAnalyzer<SymbolType> { ...@@ -259,6 +278,23 @@ public class TypeChecker extends AbstractNodeAnalyzer<SymbolType> {
return resultType; return resultType;
} }
@Override
public SymbolType analyze(MethodCallExpr node) {
FuncType funcType = (FuncType) node.method.dispatch(this);
if(funcType == null) {
err(node, "method is not callable.");
return NONE_TYPE;
}
List<SymbolType> args_type = new ArrayList<>();
for(Expr expr : node.args) {
args_type.add(expr.dispatch(this));
}
if(!args_type.equals(funcType.parameters)) {
err(node, "function/method parameter list mismatch");
}
return funcType.returnType;
}
@Override @Override
public SymbolType analyze(Identifier id) { public SymbolType analyze(Identifier id) {
String varName = id.name; String varName = id.name;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment