Some changes
Some checks are pending
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run

This commit is contained in:
i22007 2024-07-04 12:29:23 -04:00
parent fbff03c3d7
commit 8eba420d48
7 changed files with 37 additions and 3 deletions

View File

@ -2,6 +2,7 @@ package ast.statementexpressions;
import ast.expressions.unaryexpressions.MemberAccessNode; import ast.expressions.unaryexpressions.MemberAccessNode;
import ast.type.type.ITypeNode; import ast.type.type.ITypeNode;
import bytecode.visitor.MethodVisitor;
import semantic.SemanticVisitor; import semantic.SemanticVisitor;
import semantic.TypeCheckResult; import semantic.TypeCheckResult;

View File

@ -1,5 +1,6 @@
package ast.statements; package ast.statements;
import bytecode.visitor.MethodVisitor;
import semantic.SemanticVisitor; import semantic.SemanticVisitor;
import semantic.TypeCheckResult; import semantic.TypeCheckResult;
import visitor.Visitable; import visitor.Visitable;
@ -22,4 +23,9 @@ public class BlockNode implements IStatementNode, Visitable {
return visitor.analyze(this); return visitor.analyze(this);
} }
@Override
public void accept(MethodVisitor methodVisitor) {
methodVisitor.visit(this);
}
} }

View File

@ -1,5 +1,6 @@
package ast.statements; package ast.statements;
import bytecode.visitor.MethodVisitor;
import semantic.SemanticVisitor; import semantic.SemanticVisitor;
import semantic.TypeCheckResult; import semantic.TypeCheckResult;

View File

@ -1,5 +1,6 @@
package ast.statements; package ast.statements;
import bytecode.visitor.MethodVisitor;
import semantic.SemanticVisitor; import semantic.SemanticVisitor;
import semantic.TypeCheckResult; import semantic.TypeCheckResult;
@ -20,6 +21,11 @@ public class IfElseNode implements IStatementNode {
elseIfStatements.add(elseIfStament); elseIfStatements.add(elseIfStament);
} }
@Override
public void accept(MethodVisitor methodVisitor) {
methodVisitor.visit(this);
}
@Override @Override
public TypeCheckResult accept(SemanticVisitor visitor) { public TypeCheckResult accept(SemanticVisitor visitor) {
return visitor.analyze(this); return visitor.analyze(this);

View File

@ -1,6 +1,7 @@
package ast.statements; package ast.statements;
import ast.expressions.IExpressionNode; import ast.expressions.IExpressionNode;
import bytecode.visitor.MethodVisitor;
import semantic.SemanticVisitor; import semantic.SemanticVisitor;
import semantic.TypeCheckResult; import semantic.TypeCheckResult;
@ -17,6 +18,11 @@ public class WhileNode implements IStatementNode {
} }
@Override
public void accept(MethodVisitor methodVisitor) {
methodVisitor.visit(this);
}
@Override @Override
public TypeCheckResult accept(SemanticVisitor visitor) { public TypeCheckResult accept(SemanticVisitor visitor) {
return visitor.analyze(this); return visitor.analyze(this);

View File

@ -16,6 +16,8 @@ import ast.statementexpressions.crementexpressions.DecrementNode;
import ast.statementexpressions.crementexpressions.IncrementNode; import ast.statementexpressions.crementexpressions.IncrementNode;
import ast.statementexpressions.methodcallstatementnexpressions.MethodCallNode; import ast.statementexpressions.methodcallstatementnexpressions.MethodCallNode;
import ast.statements.*; import ast.statements.*;
import ast.type.AccessModifierNode;
import ast.type.EnumAccessModifierNode;
import ast.type.ValueNode; import ast.type.ValueNode;
import ast.type.type.BaseType; import ast.type.type.BaseType;
import ast.type.type.ReferenceType; import ast.type.type.ReferenceType;
@ -78,8 +80,10 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor {
@Override @Override
public void visit(MainMethodNode mainMethodNode) { public void visit(MainMethodNode mainMethodNode) {
methodVisitor = classWriter.visitMethod(mapper.mapAccessTypeToOpcode(mainMethodNode.accesModifier), AccessModifierNode accessModifierNode = new AccessModifierNode("");
mainMethodNode.getIdentifier(), accessModifierNode.accessType = EnumAccessModifierNode.PUBLIC_STATIC;
methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC,
"main",
"([Ljava/lang/String;)V", "([Ljava/lang/String;)V",
null, null,
null); null);
@ -318,9 +322,17 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor {
// Statements // Statements
@Override
public void visit(BlockNode blockNode) {
for(IStatementNode statementNode : blockNode.statements) {
statementNode.accept(this);
}
}
@Override @Override
public void visit(IfElseNode ifElseNode) { public void visit(IfElseNode ifElseNode) {
Label elseLabel = new Label(); Label elseLabel = new Label();
Label endLabel = new Label();
Label[] elseIfLabels = new Label[ifElseNode.elseIfStatements.size()]; Label[] elseIfLabels = new Label[ifElseNode.elseIfStatements.size()];
for (int i = 0; i < ifElseNode.elseIfStatements.size(); i++) { for (int i = 0; i < ifElseNode.elseIfStatements.size(); i++) {
@ -338,7 +350,6 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor {
ifElseNode.ifStatement.block.accept(this); // accept if block ifElseNode.ifStatement.block.accept(this); // accept if block
Label endLabel = new Label();
methodVisitor.visitJumpInsn(GOTO, endLabel); methodVisitor.visitJumpInsn(GOTO, endLabel);
for (int i = 0; i < ifElseNode.elseIfStatements.size(); i++) { for (int i = 0; i < ifElseNode.elseIfStatements.size(); i++) {
@ -357,6 +368,8 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor {
if (ifElseNode.elseStatement != null) { if (ifElseNode.elseStatement != null) {
methodVisitor.visitLabel(elseLabel); methodVisitor.visitLabel(elseLabel);
ifElseNode.elseStatement.block.accept(this); ifElseNode.elseStatement.block.accept(this);
} else {
methodVisitor.visitLabel(elseLabel);
} }
methodVisitor.visitLabel(endLabel); methodVisitor.visitLabel(endLabel);

View File

@ -43,6 +43,7 @@ public interface MethodVisitor {
void visit(UnaryNode unaryExpressionNode); void visit(UnaryNode unaryExpressionNode);
// statements // statements
void visit(BlockNode blockNode);
void visit(IfElseNode ifElseNode); void visit(IfElseNode ifElseNode);
void visit(IncrementNode incrementNode); void visit(IncrementNode incrementNode);