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