Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- address
- package codeGenerator;
- import ast.expression.FieldAccess;
- import ast.expression.Indexing;
- import ast.expression.Variable;
- import visitor.AbstractVisitor;
- import ast.definition.VarDefinition;
- import ast.type.RecordType;
- public class AddressVisitor extends AbstractVisitor {
- @Override
- public Object visit(Variable v, Object o) {
- //Global variable
- if(v.getVardef().getScope()==0) {
- cg.push("a", ((VarDefinition)v.getVardef()).getOffset());
- }
- //Local variable
- else {
- cg.pushabp();
- cg.push("i", ((VarDefinition)v.getVardef()).getOffset());
- cg.add("i");
- }
- return null;
- }
- @Override
- public Object visit(FieldAccess fa, Object o) {
- fa.getObject().accept(Visitors.addressVisitor, null);
- cg.push("i", ((RecordType)fa.getObject().getType()).getField(fa.getFieldName()).getOffset());
- cg.add("i");
- return null;
- }
- @Override
- public Object visit (Indexing indexing, Object p) {
- indexing.getArray().accept(Visitors.addressVisitor, null);
- indexing.getIndex().accept(Visitors.valueVisitor, null);
- //convert
- cg.push("i", indexing.getType().numberOfBytes());
- cg.mul("i");
- cg.add("i");
- return null;
- }
- }
- --------------------------------------------------------------------------------------------------------------------------
- execute
- public ExecuteVisitor (String input, String output) {
- this.input = input;
- cg.createFile(output);
- }
- @Override
- public Object visit(WhileStmt wh, Object o) {
- int labels = cg.getLabels(2);
- cg.label(labels);
- wh.getCondition().accept(Visitors.valueVisitor, null);
- cg.jz(labels+1);
- //while
- for(Statement s : wh.getWhileBody())
- s.accept(Visitors.executeVisitor, null);
- cg.jmp(labels);
- cg.label(labels+1);
- return null;
- }
- @Override
- public Object visit (IfStatement ifstmt, Object p) {
- int labels = cg.getLabels(2);
- ifstmt.getCondition().accept(Visitors.valueVisitor, null);
- //convert
- cg.jz(labels);
- //if
- for(Statement stmt : ifstmt.getIfBody())
- stmt.accept(Visitors.executeVisitor, null);
- cg.jmp(labels+1);
- cg.label(labels);
- //else
- for(Statement stmt : ifstmt.getElseBody())
- stmt.accept(Visitors.executeVisitor, null);
- cg.label(labels+1);
- return null;
- }
- ----------------------------------------------------------------------------
- @Override
- public Object visit (Indexing indexing, Object p) {
- indexing.accept(Visitors.addressVisitor, null);
- cg.load(indexing.getType().suffix());
- return null;
- }
- @Override
- public Object visit(Cast cast, Object o) {
- cast.getExpression().accept(Visitors.valueVisitor, null);
- cg.convertTo(cast.getExpression().getType().suffix(), cast.getType().suffix());
- return null;
- }
- //Built-in types
- @Override
- public Object visit(IntLiteral i, Object o) {
- cg.push("i", i.getValue());
- return null;
- }
- @Override
- public Object visit(RealLiteral r, Object o) {
- cg.push("f", r.getValue());
- return null;
- }
- @Override
- public Object visit(CharLiteral c, Object o) {
- cg.push("b", c.getValue());
- return null;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement