task 6 in progress!
This commit is contained in:
		
							parent
							
								
									a59e60d2bc
								
							
						
					
					
						commit
						f13138827f
					
				@ -20,4 +20,11 @@
 | 
			
		||||
		<nature>org.eclipse.jdt.core.javanature</nature>
 | 
			
		||||
		<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
 | 
			
		||||
	</natures>
 | 
			
		||||
	<linkedResources>
 | 
			
		||||
		<link>
 | 
			
		||||
			<name>programs</name>
 | 
			
		||||
			<type>2</type>
 | 
			
		||||
			<location>/home/simon/Documents/Uni/CS/CSCU9A5-2/Ass1/src/a5-triangle-tools/programs</location>
 | 
			
		||||
		</link>
 | 
			
		||||
	</linkedResources>
 | 
			
		||||
</projectDescription>
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,41 @@
 | 
			
		||||
/*
 | 
			
		||||
 * @(#)WhileCommand.java                       
 | 
			
		||||
 * 
 | 
			
		||||
 * Revisions and updates (c) 2022-2023 Sandy Brownlee. alexander.brownlee@stir.ac.uk
 | 
			
		||||
 * 
 | 
			
		||||
 * Original release:
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown
 | 
			
		||||
 * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland
 | 
			
		||||
 * and School of Computer and Math Sciences, The Robert Gordon University,
 | 
			
		||||
 * St. Andrew Street, Aberdeen AB25 1HG, Scotland.
 | 
			
		||||
 * All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * This software is provided free for educational use only. It may
 | 
			
		||||
 * not be used for commercial purposes without the prior written permission
 | 
			
		||||
 * of the authors.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package triangle.abstractSyntaxTrees.commands;
 | 
			
		||||
 | 
			
		||||
import triangle.abstractSyntaxTrees.expressions.Expression;
 | 
			
		||||
import triangle.abstractSyntaxTrees.visitors.CommandVisitor;
 | 
			
		||||
import triangle.syntacticAnalyzer.SourcePosition;
 | 
			
		||||
 | 
			
		||||
public class LoopWhile extends Command {
 | 
			
		||||
 | 
			
		||||
	public LoopWhile(Expression eAST,Command c1AST, Command c2AST, SourcePosition position) {
 | 
			
		||||
		super(position);
 | 
			
		||||
		E = eAST;
 | 
			
		||||
		C1 = c1AST;
 | 
			
		||||
		C2 = c2AST;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
 | 
			
		||||
		return v.visitLoopWhile(this, arg);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Expression E;
 | 
			
		||||
	public final Command C1;
 | 
			
		||||
	public final Command C2;
 | 
			
		||||
}
 | 
			
		||||
@ -5,6 +5,7 @@ import triangle.abstractSyntaxTrees.commands.CallCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.EmptyCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.IfCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.LetCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.LoopWhile;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.SequentialCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.WhileCommand;
 | 
			
		||||
 | 
			
		||||
@ -24,4 +25,6 @@ public interface CommandVisitor<TArg, TResult> {
 | 
			
		||||
 | 
			
		||||
	TResult visitWhileCommand(WhileCommand ast, TArg arg);
 | 
			
		||||
 | 
			
		||||
	TResult visitLoopWhile(LoopWhile loopWhile, TArg arg);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -42,6 +42,7 @@ import triangle.abstractSyntaxTrees.commands.CallCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.EmptyCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.IfCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.LetCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.LoopWhile;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.SequentialCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.WhileCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.declarations.BinaryOperatorDeclaration;
 | 
			
		||||
@ -793,4 +794,10 @@ public final class Encoder implements ActualParameterVisitor<Frame, Integer>,
 | 
			
		||||
		var baseObject = (AddressableEntity) V.visit(this, frame);
 | 
			
		||||
		baseObject.encodeFetchAddress(emitter, frame, V);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Void visitLoopWhile(LoopWhile loopWhile, Frame arg) {
 | 
			
		||||
		// TODO Auto-generated method stub
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -38,6 +38,7 @@ import triangle.abstractSyntaxTrees.commands.CallCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.EmptyCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.IfCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.LetCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.LoopWhile;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.SequentialCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.WhileCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.declarations.BinaryOperatorDeclaration;
 | 
			
		||||
@ -981,4 +982,10 @@ public final class Checker implements ActualParameterVisitor<FormalParameter, Vo
 | 
			
		||||
				StdEnvironment.booleanType);
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Void visitLoopWhile(LoopWhile loopWhile, Void arg) {
 | 
			
		||||
		// TODO Auto-generated method stub
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,7 @@ import triangle.abstractSyntaxTrees.commands.CallCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.EmptyCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.IfCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.LetCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.LoopWhile;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.SequentialCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.WhileCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.declarations.BinaryOperatorDeclaration;
 | 
			
		||||
@ -596,4 +597,10 @@ public class ConstantFolder implements ActualParameterVisitor<Void, AbstractSynt
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public AbstractSyntaxTree visitLoopWhile(LoopWhile loopWhile, Void arg) {
 | 
			
		||||
		// TODO Auto-generated method stub
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,7 @@ import triangle.abstractSyntaxTrees.commands.CallCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.EmptyCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.IfCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.LetCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.LoopWhile;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.SequentialCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.WhileCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.declarations.BinaryOperatorDeclaration;
 | 
			
		||||
@ -611,4 +612,10 @@ public class SummaryStats implements ActualParameterVisitor<Void, AbstractSyntax
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
	@Override
 | 
			
		||||
	public AbstractSyntaxTree visitLoopWhile(LoopWhile loopWhile, Void arg) {
 | 
			
		||||
		// TODO Auto-generated method stub
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -41,6 +41,7 @@ import triangle.abstractSyntaxTrees.commands.Command;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.EmptyCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.IfCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.LetCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.LoopWhile;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.SequentialCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.WhileCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.declarations.ConstDeclaration;
 | 
			
		||||
@ -356,6 +357,29 @@ public class Parser {
 | 
			
		||||
			commandAST = parseCommand();
 | 
			
		||||
			accept(Token.RCURLY);
 | 
			
		||||
			break;
 | 
			
		||||
			
 | 
			
		||||
		//Task 6
 | 
			
		||||
		case Token.LOOP: {
 | 
			
		||||
			acceptIt();
 | 
			
		||||
			
 | 
			
		||||
			accept(Token.BEGIN);
 | 
			
		||||
			Command c1AST = parseCommand(); //C1 = LOOP
 | 
			
		||||
			accept(Token.END);
 | 
			
		||||
			
 | 
			
		||||
			System.out.println("c1AST: " + c1AST.getPosition());
 | 
			
		||||
			
 | 
			
		||||
			accept(Token.WHILE);
 | 
			
		||||
			Expression eAST = parseExpression(); //E = WHILE
 | 
			
		||||
			System.out.println("eAST: " + eAST.getPosition());
 | 
			
		||||
			
 | 
			
		||||
			accept(Token.DO);
 | 
			
		||||
			Command c2AST = parseSingleCommand(); //C2 = DO
 | 
			
		||||
			System.out.println("c2AST: " + c2AST.getPosition());
 | 
			
		||||
			
 | 
			
		||||
			finish(commandPos);
 | 
			
		||||
			commandAST = new LoopWhile(eAST, c1AST, c2AST, commandPos);
 | 
			
		||||
		}
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case Token.SEMICOLON:
 | 
			
		||||
		case Token.END:
 | 
			
		||||
 | 
			
		||||
@ -67,20 +67,20 @@ final class Token extends Object {
 | 
			
		||||
	INTLITERAL = 0, CHARLITERAL = 1, IDENTIFIER = 2, OPERATOR = 3,
 | 
			
		||||
 | 
			
		||||
			// reserved words - must be in alphabetical order...
 | 
			
		||||
			ARRAY = 4, BEGIN = 5, CONST = 6, DO = 7, ELSE = 8, END = 9, FUNC = 10, IF = 11, IN = 12, LET = 13, OF = 14,
 | 
			
		||||
			PROC = 15, RECORD = 16, THEN = 17, TYPE = 18, VAR = 19, WHILE = 20,
 | 
			
		||||
			ARRAY = 4, BEGIN = 5, CONST = 6, DO = 7, ELSE = 8, END = 9, FUNC = 10, IF = 11, IN = 12, LET = 13, LOOP = 14, OF = 15,
 | 
			
		||||
			PROC = 16, RECORD = 17, THEN = 18, TYPE = 19, VAR = 20, WHILE = 21,
 | 
			
		||||
 | 
			
		||||
			// punctuation...
 | 
			
		||||
			DOT = 21, COLON = 22, SEMICOLON = 23, COMMA = 24, BECOMES = 25, IS = 26,
 | 
			
		||||
			DOT = 22, COLON = 23, SEMICOLON = 24, COMMA = 25, BECOMES = 26, IS = 27,
 | 
			
		||||
 | 
			
		||||
			// brackets...
 | 
			
		||||
			LPAREN = 27, RPAREN = 28, LBRACKET = 29, RBRACKET = 30, LCURLY = 31, RCURLY = 32,
 | 
			
		||||
			LPAREN = 28, RPAREN = 29, LBRACKET = 30, RBRACKET = 31, LCURLY = 32, RCURLY = 33,
 | 
			
		||||
 | 
			
		||||
			// special tokens...
 | 
			
		||||
			EOT = 33, ERROR = 34;
 | 
			
		||||
			EOT = 34, ERROR = 35;
 | 
			
		||||
 | 
			
		||||
	private static String[] tokenTable = new String[] { "<int>", "<char>", "<identifier>", "<operator>", "array",
 | 
			
		||||
			"begin", "const", "do", "else", "end", "func", "if", "in", "let", "of", "proc", "record", "then", "type",
 | 
			
		||||
			"begin", "const", "do", "else", "end", "func", "if", "in", "let", "loop", "of", "proc", "record", "then", "type",
 | 
			
		||||
			"var", "while", ".", ":", ";", ",", ":=", "~", "(", ")", "[", "]", "{", "}", "", "<error>" };
 | 
			
		||||
 | 
			
		||||
	private final static int firstReservedWord = Token.ARRAY, lastReservedWord = Token.WHILE;
 | 
			
		||||
 | 
			
		||||
@ -37,6 +37,7 @@ import triangle.abstractSyntaxTrees.commands.CallCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.EmptyCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.IfCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.LetCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.LoopWhile;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.SequentialCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.commands.WhileCommand;
 | 
			
		||||
import triangle.abstractSyntaxTrees.declarations.BinaryOperatorDeclaration;
 | 
			
		||||
@ -681,4 +682,10 @@ public class LayoutVisitor implements ActualParameterVisitor<Void, DrawingTree>,
 | 
			
		||||
		return r;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public DrawingTree visitLoopWhile(LoopWhile loopWhile, Void arg) {
 | 
			
		||||
		// TODO Auto-generated method stub
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								loopwhile.tam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								loopwhile.tam
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							@ -2,17 +2,11 @@ let
 | 
			
		||||
    var a : Integer;
 | 
			
		||||
    var b : Integer;
 | 
			
		||||
    var c : Integer;
 | 
			
		||||
 | 
			
		||||
    var x : Char;
 | 
			
		||||
    var y : Char
 | 
			
		||||
in
 | 
			
		||||
    {
 | 
			
		||||
        a := 1;
 | 
			
		||||
        b := 2;
 | 
			
		||||
        a**;
 | 
			
		||||
 | 
			
		||||
        a := 1; b := 2; a**;
 | 
			
		||||
        b := 100;
 | 
			
		||||
 | 
			
		||||
        x := 'A';
 | 
			
		||||
        y := 'Z';
 | 
			
		||||
        x := 'A'; y := 'Z';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								programs/loopwhile.tri
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								programs/loopwhile.tri
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
! print out ababababa
 | 
			
		||||
 | 
			
		||||
let
 | 
			
		||||
  var a : Integer
 | 
			
		||||
in
 | 
			
		||||
begin
 | 
			
		||||
  a := 0;
 | 
			
		||||
  loop
 | 
			
		||||
  begin
 | 
			
		||||
    put('a');
 | 
			
		||||
    a := a + 1;
 | 
			
		||||
  end
 | 
			
		||||
  while a < 5 do
 | 
			
		||||
  	put('b');
 | 
			
		||||
  
 | 
			
		||||
end
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user