Compare commits

..

No commits in common. "edb7aafd77e0a0581ca13933bb1af4a8f1ea0523" and "c4061125c45aa6e339f9387bb35fcaade71bb865" have entirely different histories.

21 changed files with 44 additions and 53 deletions

View File

@ -40,7 +40,7 @@
</list> </list>
</option> </option>
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="openjdk-21" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_22" default="true" project-jdk-name="openjdk-22" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
</project> </project>

View File

@ -5,9 +5,7 @@ public class Example {
public static int testMethod(char b){ public static int testMethod(char b){
int a; int a;
boolean b; a = 3;
char c;
b = 3;
} }

View File

@ -1,6 +1,6 @@
package ast; package ast;
public interface ASTNode { public class ASTNode {
} }

View File

@ -13,7 +13,7 @@ import semantic.SemanticVisitor;
import typechecker.TypeCheckResult; import typechecker.TypeCheckResult;
import typechecker.Visitable; import typechecker.Visitable;
public class ClassNode implements ASTNode, Visitable { public class ClassNode extends ASTNode implements Visitable {
public String identifier; public String identifier;
public AccessTypeNode accessType; public AccessTypeNode accessType;
public List<MemberNode> members = new ArrayList<>(); public List<MemberNode> members = new ArrayList<>();
@ -40,7 +40,7 @@ public class ClassNode implements ASTNode, Visitable {
@Override @Override
public TypeCheckResult accept(SemanticVisitor visitor) { public TypeCheckResult accept(SemanticVisitor visitor) {
return visitor.analyze(this); return visitor.typeCheck(this);
} }
@Override @Override

View File

@ -8,7 +8,7 @@ import semantic.SemanticVisitor;
import typechecker.TypeCheckResult; import typechecker.TypeCheckResult;
import typechecker.Visitable; import typechecker.Visitable;
public class ProgramNode implements ASTNode, Visitable{ public class ProgramNode extends ASTNode implements Visitable {
public List<ClassNode> classes = new ArrayList<>(); public List<ClassNode> classes = new ArrayList<>();
public void addClass(ClassNode classNode) { public void addClass(ClassNode classNode) {
@ -17,7 +17,7 @@ public class ProgramNode implements ASTNode, Visitable{
@Override @Override
public TypeCheckResult accept(SemanticVisitor visitor) { public TypeCheckResult accept(SemanticVisitor visitor) {
return visitor.analyze(this); return visitor.typeCheck(this);
} }
@Override @Override

View File

@ -1,6 +1,6 @@
package ast; package ast;
public class VarNode implements ASTNode{ public class VarNode extends ASTNode{
private String identifier; private String identifier;
private String type; private String type;

View File

@ -2,7 +2,7 @@ package ast.expression;
import ast.ASTNode; import ast.ASTNode;
public class ExpressionNode implements ASTNode { public class ExpressionNode extends ASTNode {

View File

@ -7,7 +7,7 @@ import semantic.SemanticVisitor;
import typechecker.TypeCheckResult; import typechecker.TypeCheckResult;
import typechecker.Visitable; import typechecker.Visitable;
public class FieldNode implements MemberNode, Visitable { public class FieldNode extends MemberNode implements Visitable {
public AccessTypeNode accessTypeNode; public AccessTypeNode accessTypeNode;
public TypeNode type; public TypeNode type;
public String identifier; public String identifier;
@ -20,7 +20,7 @@ public class FieldNode implements MemberNode, Visitable {
@Override @Override
public TypeCheckResult accept(SemanticVisitor visitor) { public TypeCheckResult accept(SemanticVisitor visitor) {
return visitor.analyze(this); return visitor.typeCheck(this);
} }
@Override @Override

View File

@ -2,5 +2,5 @@ package ast.member;
import ast.ASTNode; import ast.ASTNode;
public interface MemberNode extends ASTNode { public class MemberNode extends ASTNode {
} }

View File

@ -13,7 +13,7 @@ import semantic.SemanticVisitor;
import typechecker.TypeCheckResult; import typechecker.TypeCheckResult;
import typechecker.Visitable; import typechecker.Visitable;
public class MethodNode implements MemberNode, Visitable { public class MethodNode extends MemberNode implements Visitable {
public AccessTypeNode visibility; public AccessTypeNode visibility;
public TypeNode type; public TypeNode type;
public String identifier; public String identifier;
@ -38,7 +38,7 @@ public class MethodNode implements MemberNode, Visitable {
@Override @Override
public TypeCheckResult accept(SemanticVisitor visitor) { public TypeCheckResult accept(SemanticVisitor visitor) {
return visitor.analyze(this); return visitor.typeCheck(this);
} }
@Override @Override

View File

@ -5,8 +5,8 @@ import ast.ASTNode;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class ParameterListNode implements ASTNode { public class ParameterListNode extends ASTNode {
List<ParameterNode> parameters = new ArrayList<>(); public List<ParameterNode> parameters = new ArrayList<>();
public ParameterListNode(List<ParameterNode> parameters){ public ParameterListNode(List<ParameterNode> parameters){
this.parameters = parameters; this.parameters = parameters;

View File

@ -3,7 +3,7 @@ package ast.parameter;
import ast.ASTNode; import ast.ASTNode;
import ast.type.TypeNode; import ast.type.TypeNode;
public class ParameterNode implements ASTNode { public class ParameterNode extends ASTNode {
public TypeNode type; public TypeNode type;
public String identifier; public String identifier;

View File

@ -17,6 +17,6 @@ public class AssignmentStatementNode extends StatementNode implements Visitable
@Override @Override
public TypeCheckResult accept(SemanticVisitor visitor) { public TypeCheckResult accept(SemanticVisitor visitor) {
return visitor.analyze(this); return visitor.typeCheck(this);
} }
} }

View File

@ -2,6 +2,6 @@ package ast.statement;
import ast.ASTNode; import ast.ASTNode;
public abstract class StatementNode implements ASTNode { public abstract class StatementNode extends ASTNode {
} }

View File

@ -2,7 +2,7 @@ package ast.type;
import ast.ASTNode; import ast.ASTNode;
public class AccessTypeNode implements ASTNode { public class AccessTypeNode extends ASTNode {
public EnumAccessTypeNode enumAccessTypeNode; public EnumAccessTypeNode enumAccessTypeNode;
public AccessTypeNode(EnumAccessTypeNode enumAccessTypeNode) { public AccessTypeNode(EnumAccessTypeNode enumAccessTypeNode) {

View File

@ -1,11 +0,0 @@
package ast.type;
public class BaseTypeNode implements TypeNode{
public EnumTypeNode enumType;
public BaseTypeNode(EnumTypeNode enumType) {
this.enumType = enumType;
}
}

View File

@ -1,4 +0,0 @@
package ast.type;
public class ReferenceTypeNode implements TypeNode{
}

View File

@ -2,5 +2,10 @@ package ast.type;
import ast.ASTNode; import ast.ASTNode;
public interface TypeNode extends ASTNode { public class TypeNode extends ASTNode {
public EnumTypeNode enumTypeNode;
public TypeNode(EnumTypeNode enumTypeNode) {
this.enumTypeNode = enumTypeNode;
}
} }

View File

@ -11,7 +11,10 @@ import ast.member.MethodNode;
import ast.parameter.ParameterListNode; import ast.parameter.ParameterListNode;
import ast.parameter.ParameterNode; import ast.parameter.ParameterNode;
import ast.statement.*; import ast.statement.*;
import ast.type.*; import ast.type.AccessTypeNode;
import ast.type.EnumAccessTypeNode;
import ast.type.EnumTypeNode;
import ast.type.TypeNode;
import org.antlr.v4.runtime.tree.TerminalNode; import org.antlr.v4.runtime.tree.TerminalNode;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -84,11 +87,11 @@ public class ASTBuilder extends SimpleJavaBaseVisitor<ASTNode> {
String typeStr = ctx.getText(); String typeStr = ctx.getText();
switch (typeStr) { switch (typeStr) {
case "int": case "int":
return new BaseTypeNode(EnumTypeNode.INT); return new TypeNode(EnumTypeNode.INT);
case "boolean": case "boolean":
return new BaseTypeNode(EnumTypeNode.BOOLEAN); return new TypeNode(EnumTypeNode.BOOLEAN);
case "char": case "char":
return new BaseTypeNode(EnumTypeNode.CHAR); return new TypeNode(EnumTypeNode.CHAR);
default: default:
throw new IllegalArgumentException("Unsupported type: " + typeStr); throw new IllegalArgumentException("Unsupported type: " + typeStr);
} }

View File

@ -30,7 +30,7 @@ public class SemanticAnalyzer implements SemanticVisitor {
} }
@Override @Override
public TypeCheckResult analyze(ProgramNode node) { public TypeCheckResult typeCheck(ProgramNode node) {
var valid = true; var valid = true;
@ -42,7 +42,7 @@ public class SemanticAnalyzer implements SemanticVisitor {
} }
@Override @Override
public TypeCheckResult analyze(ClassNode classNode) { public TypeCheckResult typeCheck(ClassNode classNode) {
List<MemberNode> members = classNode.members; List<MemberNode> members = classNode.members;
for (MemberNode memberNode : members) { for (MemberNode memberNode : members) {
if (memberNode instanceof FieldNode fieldNode) { if (memberNode instanceof FieldNode fieldNode) {
@ -56,7 +56,7 @@ public class SemanticAnalyzer implements SemanticVisitor {
} }
@Override @Override
public TypeCheckResult analyze(MethodNode methodNode) { public TypeCheckResult typeCheck(MethodNode methodNode) {
List<StatementNode> statements = methodNode.statements; List<StatementNode> statements = methodNode.statements;
for (StatementNode statement : statements) { for (StatementNode statement : statements) {
if(statement instanceof AssignmentStatementNode assignmentStatementNode) { if(statement instanceof AssignmentStatementNode assignmentStatementNode) {
@ -67,7 +67,7 @@ public class SemanticAnalyzer implements SemanticVisitor {
} }
@Override @Override
public TypeCheckResult analyze(FieldNode toCheck) { public TypeCheckResult typeCheck(FieldNode toCheck) {
if(currentFields.contains(toCheck.identifier)){ if(currentFields.contains(toCheck.identifier)){
throw new RuntimeException(toCheck.identifier + " Is Already Declared"); throw new RuntimeException(toCheck.identifier + " Is Already Declared");
}else { }else {
@ -77,13 +77,13 @@ public class SemanticAnalyzer implements SemanticVisitor {
} }
@Override @Override
public TypeCheckResult analyze(AssignmentStatementNode assignmentStatementNode) { public TypeCheckResult typeCheck(AssignmentStatementNode assignmentStatementNode) {
if(assignmentStatementNode.expression instanceof LiteralNode literalNode) { if(assignmentStatementNode.expression instanceof LiteralNode literalNode) {
VarNode varNode = assignmentStatementNode.varNode; VarNode varNode = assignmentStatementNode.varNode;
if(varNode.getType().equals(literalNode.getType())) { if(varNode.getType().equals(literalNode.getType())) {
System.out.println("Type is same"); System.out.println("Type is same");
} else { } else {
throw new RuntimeException("Type mismatch"); System.out.println("Type Mismatch");
} }
} }
return null; return null;

View File

@ -11,15 +11,15 @@ import typechecker.TypeCheckResult;
public interface SemanticVisitor { public interface SemanticVisitor {
// TypeCheckResult typeCheck(ASTNode toCheck); // TypeCheckResult typeCheck(ASTNode toCheck);
TypeCheckResult analyze(ProgramNode toCheck); TypeCheckResult typeCheck(ProgramNode toCheck);
TypeCheckResult analyze(ClassNode toCheck); TypeCheckResult typeCheck(ClassNode toCheck);
TypeCheckResult analyze(MethodNode toCheck); TypeCheckResult typeCheck(MethodNode toCheck);
TypeCheckResult analyze(FieldNode toCheck); TypeCheckResult typeCheck(FieldNode toCheck);
TypeCheckResult analyze(AssignmentStatementNode toCheck); TypeCheckResult typeCheck(AssignmentStatementNode toCheck);
// //
// TypeCheckResult typeCheck(MethodParameter toCheck); // TypeCheckResult typeCheck(MethodParameter toCheck);
// //