Finished regression testing for PA3
parent
3517e9648c
commit
5580416065
|
@ -14,6 +14,7 @@ public class Analyzer implements Visitor<IdentificationTable, Type> {
|
||||||
private MethodDecl mainMethod = null;
|
private MethodDecl mainMethod = null;
|
||||||
private ClassDecl currentClassDecl = null;
|
private ClassDecl currentClassDecl = null;
|
||||||
private MethodDecl currentMethodDecl = null;
|
private MethodDecl currentMethodDecl = null;
|
||||||
|
private VarDecl currentVarDecl = null;
|
||||||
private IdentificationTable table = new IdentificationTable();
|
private IdentificationTable table = new IdentificationTable();
|
||||||
|
|
||||||
// Keep track of all predefined names to handle
|
// Keep track of all predefined names to handle
|
||||||
|
@ -125,6 +126,8 @@ public class Analyzer implements Visitor<IdentificationTable, Type> {
|
||||||
// Must check that the type of the field can be identified
|
// Must check that the type of the field can be identified
|
||||||
if (!table.classExists(fd.type)) {
|
if (!table.classExists(fd.type)) {
|
||||||
Reporter.report(ErrorType.UNDECLARED_TYPE, fd.type, null);
|
Reporter.report(ErrorType.UNDECLARED_TYPE, fd.type, null);
|
||||||
|
} else if(fd.type.typeKind == TypeKind.VOID) {
|
||||||
|
Reporter.report(ErrorType.VOID_TYPE, fd.type, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
return fd.type;
|
return fd.type;
|
||||||
|
@ -169,6 +172,8 @@ public class Analyzer implements Visitor<IdentificationTable, Type> {
|
||||||
arg.setDeclarationAtScope(pd);
|
arg.setDeclarationAtScope(pd);
|
||||||
if (!table.classExists(pd.type)) {
|
if (!table.classExists(pd.type)) {
|
||||||
Reporter.report(ErrorType.UNDECLARED_TYPE, pd.type, null);
|
Reporter.report(ErrorType.UNDECLARED_TYPE, pd.type, null);
|
||||||
|
} else if(pd.type.typeKind == TypeKind.VOID) {
|
||||||
|
Reporter.report(ErrorType.VOID_TYPE, pd.type, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pd.type;
|
return pd.type;
|
||||||
|
@ -178,6 +183,8 @@ public class Analyzer implements Visitor<IdentificationTable, Type> {
|
||||||
arg.setDeclarationAtScope(decl);
|
arg.setDeclarationAtScope(decl);
|
||||||
if (!table.classExists(decl.type)) {
|
if (!table.classExists(decl.type)) {
|
||||||
Reporter.report(ErrorType.UNDECLARED_TYPE, decl.type, null);
|
Reporter.report(ErrorType.UNDECLARED_TYPE, decl.type, null);
|
||||||
|
} else if(decl.type.typeKind == TypeKind.VOID) {
|
||||||
|
Reporter.report(ErrorType.VOID_TYPE, decl.type, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
return decl.type;
|
return decl.type;
|
||||||
|
@ -221,20 +228,33 @@ public class Analyzer implements Visitor<IdentificationTable, Type> {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The stmt of the vardecl may not refer to the variable itself so we check the stmt first
|
// The stmt of the vardecl may not refer to the variable itself
|
||||||
public Type visitVardeclStmt(VarDeclStmt stmt, IdentificationTable arg) {
|
public Type visitVardeclStmt(VarDeclStmt stmt, IdentificationTable arg) {
|
||||||
Type initExpType = stmt.initExp.visit(this, arg);
|
|
||||||
Type varDeclType = stmt.varDecl.visit(this, arg);
|
Type varDeclType = stmt.varDecl.visit(this, arg);
|
||||||
|
|
||||||
|
currentVarDecl = stmt.varDecl;
|
||||||
|
Type initExpType = stmt.initExp.visit(this, arg);
|
||||||
IdentificationTable.match(varDeclType, initExpType, true);
|
IdentificationTable.match(varDeclType, initExpType, true);
|
||||||
|
currentVarDecl = null;
|
||||||
|
|
||||||
|
// Can't have a class reference as the sole rhs
|
||||||
|
if(stmt.initExp instanceof RefExpr && initExpType.typeKind == TypeKind.CLASS) {
|
||||||
|
RefExpr re = (RefExpr)stmt.initExp;
|
||||||
|
Declaration decl = table.getDeclarationAtScope(re.ref.decl.name);
|
||||||
|
if(decl != null) Reporter.report(ErrorType.CLASS_IDENTIFER, stmt, null);
|
||||||
|
}
|
||||||
|
|
||||||
return varDeclType;
|
return varDeclType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Type visitAssignStmt(AssignStmt stmt, IdentificationTable arg) {
|
public Type visitAssignStmt(AssignStmt stmt, IdentificationTable arg) {
|
||||||
Type valType = stmt.val.visit(this, arg);
|
|
||||||
Type refType = stmt.ref.visit(this, arg);
|
Type refType = stmt.ref.visit(this, arg);
|
||||||
|
Type valType = stmt.val.visit(this, arg);
|
||||||
IdentificationTable.match(valType, refType, true);
|
IdentificationTable.match(valType, refType, true);
|
||||||
|
|
||||||
|
if(stmt.ref.decl instanceof MethodDecl)
|
||||||
|
Reporter.report(ErrorType.FUNCTION_ASSIGNMENT, stmt.ref.decl, null);
|
||||||
|
|
||||||
return refType;
|
return refType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,6 +262,8 @@ public class Analyzer implements Visitor<IdentificationTable, Type> {
|
||||||
|
|
||||||
Type methodType = stmt.methodRef.visit(this, arg);
|
Type methodType = stmt.methodRef.visit(this, arg);
|
||||||
|
|
||||||
|
if(methodType.typeKind != TypeKind.ERROR) {
|
||||||
|
|
||||||
// Check that parameter count is correct and each type is correct
|
// Check that parameter count is correct and each type is correct
|
||||||
MethodDecl decl = (MethodDecl) stmt.methodRef.decl;
|
MethodDecl decl = (MethodDecl) stmt.methodRef.decl;
|
||||||
if (decl.parameterDeclList.size() != stmt.argList.size()) {
|
if (decl.parameterDeclList.size() != stmt.argList.size()) {
|
||||||
|
@ -253,6 +275,7 @@ public class Analyzer implements Visitor<IdentificationTable, Type> {
|
||||||
IdentificationTable.match(pdType, exprType, true);
|
IdentificationTable.match(pdType, exprType, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return methodType;
|
return methodType;
|
||||||
}
|
}
|
||||||
|
@ -424,8 +447,8 @@ public class Analyzer implements Visitor<IdentificationTable, Type> {
|
||||||
return new BaseType(TypeKind.ERROR, ref.id.posn);
|
return new BaseType(TypeKind.ERROR, ref.id.posn);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the qualifed ref is a class declaration, members must be static
|
// If the qualifed ref is a class declaration, members must be static (must check for 'this')
|
||||||
else if(qualified instanceof ClassDecl) {
|
else if(qualified instanceof ClassDecl && !(ref.ref instanceof ThisRef)) {
|
||||||
if(!md.isStatic) {
|
if(!md.isStatic) {
|
||||||
Reporter.report(ErrorType.STATIC, md, ref.id);
|
Reporter.report(ErrorType.STATIC, md, ref.id);
|
||||||
return new BaseType(TypeKind.ERROR, ref.id.posn);
|
return new BaseType(TypeKind.ERROR, ref.id.posn);
|
||||||
|
@ -453,7 +476,7 @@ public class Analyzer implements Visitor<IdentificationTable, Type> {
|
||||||
|
|
||||||
public Type visitIndexedRef(IndexedRef ref, IdentificationTable arg) {
|
public Type visitIndexedRef(IndexedRef ref, IdentificationTable arg) {
|
||||||
|
|
||||||
Type refType = ref.ref.visit(this, arg);
|
ArrayType refType = (ArrayType) ref.ref.visit(this, arg);
|
||||||
|
|
||||||
// Make sure index is an integer
|
// Make sure index is an integer
|
||||||
Type indexExprType = ref.indexExpr.visit(this, arg);
|
Type indexExprType = ref.indexExpr.visit(this, arg);
|
||||||
|
@ -462,7 +485,7 @@ public class Analyzer implements Visitor<IdentificationTable, Type> {
|
||||||
}
|
}
|
||||||
|
|
||||||
ref.decl = ref.ref.decl;
|
ref.decl = ref.ref.decl;
|
||||||
return refType;
|
return refType.eltType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Type visitIdRef(IdRef ref, IdentificationTable arg) {
|
public Type visitIdRef(IdRef ref, IdentificationTable arg) {
|
||||||
|
@ -490,6 +513,12 @@ public class Analyzer implements Visitor<IdentificationTable, Type> {
|
||||||
|
|
||||||
public Type visitIdentifier(Identifier id, IdentificationTable arg) {
|
public Type visitIdentifier(Identifier id, IdentificationTable arg) {
|
||||||
|
|
||||||
|
// Must check identifier is not of the same type being declared
|
||||||
|
if(currentVarDecl != null && currentVarDecl.name.equals(id.spelling)) {
|
||||||
|
Reporter.report(ErrorType.VARDECL_USED, id, currentVarDecl);
|
||||||
|
return new BaseType(TypeKind.ERROR, id.posn);
|
||||||
|
}
|
||||||
|
|
||||||
// Check if identifier can be found in current scope
|
// Check if identifier can be found in current scope
|
||||||
Declaration decl = arg.getDeclarationAtScope(id.spelling);
|
Declaration decl = arg.getDeclarationAtScope(id.spelling);
|
||||||
if (decl != null) { id.decl = decl; return decl.type; }
|
if (decl != null) { id.decl = decl; return decl.type; }
|
||||||
|
|
|
@ -4,7 +4,11 @@ import miniJava.AbstractSyntaxTrees.*;
|
||||||
|
|
||||||
enum ErrorType {
|
enum ErrorType {
|
||||||
THIS,
|
THIS,
|
||||||
|
VOID_TYPE,
|
||||||
|
CLASS_IDENTIFER,
|
||||||
|
VARDECL_USED,
|
||||||
NONFUNCTION_CALL,
|
NONFUNCTION_CALL,
|
||||||
|
FUNCTION_ASSIGNMENT,
|
||||||
UNDEFINED,
|
UNDEFINED,
|
||||||
STATIC,
|
STATIC,
|
||||||
VISIBILITY,
|
VISIBILITY,
|
||||||
|
@ -68,12 +72,30 @@ public class Reporter {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Can't use a class as an identifier solely
|
||||||
|
case CLASS_IDENTIFER: {
|
||||||
|
emit("Cannot use class identifier by outside of a qualified reference at " + a1.posn);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cannot have a parameter of type void
|
||||||
|
case VOID_TYPE: {
|
||||||
|
emit("Cannot have a parameter of type void at " + a1.posn);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Attempting to call a non function as a function
|
// Attempting to call a non function as a function
|
||||||
case NONFUNCTION_CALL: {
|
case NONFUNCTION_CALL: {
|
||||||
emit("Not a valid function call at " + a1.posn);
|
emit("Not a valid function call at " + a1.posn);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cannot assign a value to a function
|
||||||
|
case FUNCTION_ASSIGNMENT: {
|
||||||
|
emit("Cannot assign a value to a function at " + a1.posn);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Tried accessing a non-static member from a static method
|
// Tried accessing a non-static member from a static method
|
||||||
case STATIC: {
|
case STATIC: {
|
||||||
MemberDecl md = (MemberDecl) a1;
|
MemberDecl md = (MemberDecl) a1;
|
||||||
|
@ -162,6 +184,12 @@ public class Reporter {
|
||||||
emit("Index expression is not of type int " + a1.posn);
|
emit("Index expression is not of type int " + a1.posn);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A variable declaration identifier was used in a var decl statement
|
||||||
|
case VARDECL_USED: {
|
||||||
|
emit("Identifier at " + a1.posn + " cannot refer to the variable declaration at " + a2.posn);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error = true;
|
error = true;
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
Program ::= (ClassDeclaration)* eot
|
|
||||||
|
|
||||||
ClassDeclaration ::=
|
|
||||||
class id {
|
|
||||||
(Declarators id (; | MethodDeclaration))*
|
|
||||||
}
|
|
||||||
|
|
||||||
MethodDeclaration ::=
|
|
||||||
(ParameterList?) {
|
|
||||||
Statement* (return Expression ;)?
|
|
||||||
}
|
|
||||||
|
|
||||||
Declarators ::= (public | private)? static? Type
|
|
||||||
|
|
||||||
Type ::= boolean | void | int ([])? | id ([])?
|
|
||||||
|
|
||||||
ParameterList ::= Type id (, Type id)*
|
|
||||||
|
|
||||||
ArgumentList ::= Expression (, Expression)*
|
|
||||||
|
|
||||||
Reference ::= BaseRef (. id ([ Expression])?)*
|
|
||||||
|
|
||||||
BaseRef ::= this | id ([ Expression])?
|
|
||||||
|
|
||||||
Statement ::=
|
|
||||||
{Statement*}
|
|
||||||
| Type id = Expression;
|
|
||||||
| Reference = Expression;
|
|
||||||
| Reference ( ArgumentList? );
|
|
||||||
| if (Expression) Statement (else Statement)?
|
|
||||||
| while (Expression) Statement
|
|
||||||
|
|
||||||
Expression ::=
|
|
||||||
Reference ((ArgumentList?))?
|
|
||||||
| unop Expression
|
|
||||||
| Expression binop Expression
|
|
||||||
| ( Expression )
|
|
||||||
| num | true | false
|
|
||||||
| new (id() | int [ Expression ] | id [ Expression ] )
|
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
Program ::= (ClassDeclaration)* eot
|
|
||||||
|
|
||||||
ClassDeclaration ::=
|
|
||||||
class id {
|
|
||||||
(Declarators id (; | MethodDeclaration))*
|
|
||||||
}
|
|
||||||
|
|
||||||
MethodDeclaration ::=
|
|
||||||
(ParameterList?) {
|
|
||||||
Statement* (return Expression ;)?
|
|
||||||
}
|
|
||||||
|
|
||||||
Declarators ::= (public | private)? static? Type
|
|
||||||
|
|
||||||
Type ::= boolean | void | int ([])? | id ([])?
|
|
||||||
|
|
||||||
ParameterList ::= Type id (, Type id)*
|
|
||||||
|
|
||||||
ArgumentList ::= Expression (, Expression)*
|
|
||||||
|
|
||||||
Reference ::= BaseRef (. id ([ Expression])?)*
|
|
||||||
|
|
||||||
BaseRef ::= this | id ([ Expression])?
|
|
||||||
|
|
||||||
Statement ::=
|
|
||||||
{Statement*}
|
|
||||||
| Type id = Expression;
|
|
||||||
| Reference = Expression;
|
|
||||||
| Reference ( ArgumentList? );
|
|
||||||
| if (Expression) Statement (else Statement)?
|
|
||||||
| while (Expression) Statement
|
|
||||||
|
|
||||||
Expression ::=
|
|
||||||
num | true | false
|
|
||||||
| ( Expression )
|
|
||||||
| new (id() | int [ Expression ] | id [ Expression ] )
|
|
||||||
| Reference ((ArgumentList?))?
|
|
||||||
| DExpression
|
|
||||||
|
|
||||||
DExpression ::= CExpression (|| CExpression)*
|
|
||||||
CExpression ::= EExpression (&& EExpression)*
|
|
||||||
EExpression ::= RExpression ((==|!=) RExpression)*
|
|
||||||
RExpression ::= AExpression ((<=|<|>|>=) AExpression)*
|
|
||||||
AExpression ::= MExpression ((+|-) MExpression)*
|
|
||||||
MExpression ::= Expression ((*|/) Expression)*
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,71 +0,0 @@
|
||||||
package tester;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.Scanner;
|
|
||||||
import java.util.concurrent.ExecutorService;
|
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
|
|
||||||
/* Automated regression tester for Checkpoint 1 tests
|
|
||||||
* Created by Max Beckman-Harned
|
|
||||||
* Put your tests in "tests/pa1_tests" folder in your Eclipse workspace directory
|
|
||||||
*/
|
|
||||||
public class Checkpoint1 {
|
|
||||||
|
|
||||||
static ExecutorService threadPool = Executors.newCachedThreadPool();
|
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException, InterruptedException {
|
|
||||||
File testDir = new File(System.getProperty("java.class.path") + "/../tests/pa1_tests");
|
|
||||||
System.out.println(testDir.getAbsolutePath());
|
|
||||||
int failures = 0;
|
|
||||||
for (File x : testDir.listFiles()) {
|
|
||||||
int returnCode = runTest(x);
|
|
||||||
if (x.getName().indexOf("pass") != -1) {
|
|
||||||
if (returnCode == 0)
|
|
||||||
System.out.println(x.getName() + " passed successfully!");
|
|
||||||
else {
|
|
||||||
failures++;
|
|
||||||
System.err.println(x.getName()
|
|
||||||
+ " failed but should have passed!");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (returnCode == 4)
|
|
||||||
System.out.println(x.getName() + " failed successfully!");
|
|
||||||
else {
|
|
||||||
System.err.println(x.getName() + " did not fail properly!");
|
|
||||||
failures++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
System.out.println(failures + " failures in all.");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int runTest(File x) throws IOException, InterruptedException {
|
|
||||||
ProcessBuilder pb = new ProcessBuilder("java", "miniJava.Compiler", x.getPath()).directory(new File(System.getProperty("java.class.path")));
|
|
||||||
Process p = pb.start();
|
|
||||||
threadPool.execute(new ProcessOutputter(p.getInputStream(), false));
|
|
||||||
p.waitFor();
|
|
||||||
return p.exitValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
static class ProcessOutputter implements Runnable {
|
|
||||||
private Scanner processOutput;
|
|
||||||
private boolean output;
|
|
||||||
|
|
||||||
public ProcessOutputter(InputStream _processStream, boolean _output) {
|
|
||||||
processOutput = new Scanner(_processStream);
|
|
||||||
output = _output;
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
while(processOutput.hasNextLine()) {
|
|
||||||
String line = processOutput.nextLine();
|
|
||||||
if (output)
|
|
||||||
System.out.println(line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -3,50 +3,34 @@ package tester;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.util.Scanner;
|
import java.util.Scanner;
|
||||||
|
|
||||||
/* Automated regression tester for Checkpoint 2 tests
|
|
||||||
|
/* Automated regression tester for Checkpoint 3 tests
|
||||||
* Created by Max Beckman-Harned
|
* Created by Max Beckman-Harned
|
||||||
* Put your tests in "tests/pa2_tests" folder in your Eclipse workspace directory
|
* Put your tests in "tests/pa3_tests" folder in your Eclipse workspace directory
|
||||||
* If you preface your error messages / exceptions with ERROR or *** then they will be displayed if they appear during processing
|
* If you preface your error messages / exceptions with ERROR or *** then they will be displayed if they appear during processing
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class Checkpoint2 {
|
public class Checkpoint3 {
|
||||||
|
|
||||||
private static class ReturnInfo {
|
|
||||||
int returnCode;
|
|
||||||
String ast;
|
|
||||||
public ReturnInfo(int _returnCode, String _ast) {
|
|
||||||
returnCode = _returnCode;
|
|
||||||
ast = _ast;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException, InterruptedException {
|
public static void main(String[] args) throws IOException, InterruptedException {
|
||||||
File testDir = new File(System.getProperty("java.class.path")
|
File testDir = new File(System.getProperty("java.class.path")
|
||||||
+ "/../tests/pa2_tests");
|
+ "/../tests/pa3_tests");
|
||||||
int failures = 0;
|
int failures = 0;
|
||||||
for (File x : testDir.listFiles()) {
|
for (File x : testDir.listFiles()) {
|
||||||
if (x.getName().endsWith("out") || x.getName().startsWith("."))
|
if (x.getName().endsWith("out") || x.getName().startsWith(".") || x.getName().endsWith("mJAM") || x.getName().endsWith("asm"))
|
||||||
continue;
|
continue;
|
||||||
ReturnInfo info = runTest(x);
|
int returnCode = runTest(x);
|
||||||
int returnCode = info.returnCode;
|
|
||||||
String ast = info.ast;
|
|
||||||
if (x.getName().indexOf("pass") != -1) {
|
if (x.getName().indexOf("pass") != -1) {
|
||||||
if (returnCode == 0) {
|
if (returnCode == 0) {
|
||||||
String actualAST = getAST(new FileInputStream(x.getPath() + ".out"));
|
System.out.println(x.getName() + " processed successfully!");
|
||||||
if (actualAST.equals(ast))
|
|
||||||
System.out.println(x.getName() + " parsed successfully and has a correct AST!");
|
|
||||||
else {
|
|
||||||
System.err.println(x.getName() + " parsed successfully but has an incorrect AST!");
|
|
||||||
failures++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
failures++;
|
failures++;
|
||||||
System.err.println(x.getName()
|
System.err.println(x.getName()
|
||||||
+ " failed to be parsed!");
|
+ " failed to be processed!");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (returnCode == 4)
|
if (returnCode == 4)
|
||||||
|
@ -60,39 +44,30 @@ public class Checkpoint2 {
|
||||||
System.out.println(failures + " failures in all.");
|
System.out.println(failures + " failures in all.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ReturnInfo runTest(File x) throws IOException, InterruptedException {
|
private static int runTest(File x) throws IOException, InterruptedException {
|
||||||
ProcessBuilder pb = new ProcessBuilder("java", "miniJava.Compiler", x.getPath()).directory(new File(System.getProperty("java.class.path")));
|
ProcessBuilder pb = new ProcessBuilder("java", "miniJava.Compiler", x.getPath()).directory(new File(System.getProperty("java.class.path")));
|
||||||
pb.redirectErrorStream(true);
|
pb.redirectErrorStream(true);
|
||||||
Process p = pb.start();
|
Process p = pb.start();
|
||||||
|
|
||||||
String ast = getAST(p.getInputStream());
|
processStream(p.getInputStream());
|
||||||
p.waitFor();
|
p.waitFor();
|
||||||
int exitValue = p.exitValue();
|
int exitValue = p.exitValue();
|
||||||
return new ReturnInfo(exitValue, ast);
|
return exitValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String getAST(InputStream stream) {
|
public static void processStream(InputStream stream) {
|
||||||
Scanner scan = new Scanner(stream);
|
Scanner scan = new Scanner(stream);
|
||||||
String ast = null;
|
|
||||||
while (scan.hasNextLine()) {
|
while (scan.hasNextLine()) {
|
||||||
String line = scan.nextLine();
|
String line = scan.nextLine();
|
||||||
if (line.equals("======= AST Display =========================")) {
|
|
||||||
line = scan.nextLine();
|
|
||||||
while(scan.hasNext() && !line.equals("=============================================")) {
|
|
||||||
ast += line + "\n";
|
|
||||||
line = scan.nextLine();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (line.startsWith("*** "))
|
if (line.startsWith("*** "))
|
||||||
System.out.println(line);
|
System.out.println(line);
|
||||||
if (line.startsWith("ERROR")) {
|
if (line.startsWith("ERROR")) {
|
||||||
System.out.println(line);
|
System.out.println(line);
|
||||||
while(scan.hasNext())
|
//while(scan.hasNext())
|
||||||
System.out.println(scan.next());
|
//System.out.println(scan.next());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
scan.close();
|
scan.close();
|
||||||
return ast;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
/*** F02 is invalid qualified reference
|
||||||
|
* COMP 520
|
||||||
|
* Identification
|
||||||
|
*/
|
||||||
|
class fail61 {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
F02 c = F02;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class F02 {
|
||||||
|
public int x;
|
||||||
|
}
|
|
@ -1,2 +0,0 @@
|
||||||
// PA1 lex id fail
|
|
||||||
class _id {}
|
|
|
@ -1,2 +0,0 @@
|
||||||
// PA1 lex id fail
|
|
||||||
class boolean {}
|
|
|
@ -1,2 +0,0 @@
|
||||||
// PA1 parse fail
|
|
||||||
class Foo {}.
|
|
|
@ -1,2 +0,0 @@
|
||||||
// PA1 lex id fail
|
|
||||||
class true {}
|
|
|
@ -1,2 +0,0 @@
|
||||||
// PA1 lex comment fail
|
|
||||||
class id {} /* unterminated
|
|
|
@ -1,3 +0,0 @@
|
||||||
// PA1 lex comment fail
|
|
||||||
class /* /* nested */ */ id {}
|
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
// PA1 lex ill char fail
|
|
||||||
class NonTokens{} #
|
|
|
@ -1,7 +0,0 @@
|
||||||
// PA1 lex binop fail
|
|
||||||
class id {
|
|
||||||
void p(){
|
|
||||||
int x = 1 &| 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
// PA1 lex binop fail
|
|
||||||
class id {
|
|
||||||
void p(){
|
|
||||||
x = 1 + 2*3 = 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
// PA1 lex/parse binop fail
|
|
||||||
class id {
|
|
||||||
void p(){
|
|
||||||
int x = 1 >> 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
// PA1 lex binop fail
|
|
||||||
class id {
|
|
||||||
void p(){
|
|
||||||
while ( 1 > = 0) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
// PA1 lex trailing start char fail
|
|
||||||
class Almost {
|
|
||||||
public static void main (String [] args) {
|
|
||||||
} // nothing follows next slash
|
|
||||||
} /
|
|
|
@ -1,5 +0,0 @@
|
||||||
// PA1 lex comment fail
|
|
||||||
class IllegalComment {
|
|
||||||
public static void main (String [] args) {
|
|
||||||
} // nothing follows final *
|
|
||||||
}/* ****
|
|
|
@ -1,6 +0,0 @@
|
||||||
// PA1 parse field decl fail
|
|
||||||
class id {
|
|
||||||
static private Type x;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
// PA1 parse field decl fail
|
|
||||||
class id {
|
|
||||||
public private static Type x;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
// PA1 parse field decl fail
|
|
||||||
class id {
|
|
||||||
int x = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
// PA1 parse field decl fail
|
|
||||||
class id {
|
|
||||||
void int x;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
// PA1 parse field decl fail
|
|
||||||
class id {
|
|
||||||
public [] String x;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
// PA1 parse field decl fail
|
|
||||||
class id {
|
|
||||||
public void [] x;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse local decl fail
|
|
||||||
class id {
|
|
||||||
void foo() {
|
|
||||||
Nonesuch x[2] = 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse local decl fail
|
|
||||||
class id {
|
|
||||||
public void f(){
|
|
||||||
Ref [] x(33);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse local decl fail
|
|
||||||
class id {
|
|
||||||
public void f(){
|
|
||||||
int x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse local decl fail
|
|
||||||
class id {
|
|
||||||
public void f(){
|
|
||||||
Foo x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
// PA1 parse local decl fail
|
|
||||||
class idfail {
|
|
||||||
public void foo () {
|
|
||||||
int [] x[3] = null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
// PA1 parse local decl fail
|
|
||||||
class LValueFail {
|
|
||||||
void foo () {
|
|
||||||
true = false;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
// PA1 parse expr fail
|
|
||||||
class NonTokens{
|
|
||||||
int main () {
|
|
||||||
return a++b;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
// PA1 parse expr fail
|
|
||||||
class NonTokens{
|
|
||||||
int main () {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
// PA1 parse expr fail
|
|
||||||
class IllegalExpressions {
|
|
||||||
void main () {
|
|
||||||
z = a+!=b;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
// PA1 parse stmt fail
|
|
||||||
class IllegalStmt {
|
|
||||||
void main () {
|
|
||||||
this;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse expr fail
|
|
||||||
class IllegalExpressions {
|
|
||||||
static void foo (int a) {
|
|
||||||
if (a = a) {
|
|
||||||
a = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
// PA1 parse unop fail
|
|
||||||
class IllegalExpressions {
|
|
||||||
void foo() {
|
|
||||||
z = a!b;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
// PA1 parse ref fail
|
|
||||||
class IllegalExpressions {
|
|
||||||
void foo () {
|
|
||||||
a [b] [c] = d; // not ok
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse method fail
|
|
||||||
class IllegalExpressions {
|
|
||||||
void foo () {
|
|
||||||
if (x != 0)
|
|
||||||
return x;
|
|
||||||
return y;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse refs fail
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p() {
|
|
||||||
A a [17] = 23;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse decl fail
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p() {
|
|
||||||
boolean [] a = b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse call fail
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p(int a, boolean b) {
|
|
||||||
int p(a,b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse decl fail
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p(int a) {
|
|
||||||
Test [ ] x.y = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse assign fail
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p(int a) {
|
|
||||||
Test [ ] = a * 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse call fail
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p(int a) {
|
|
||||||
c.p(2,3)[3] = 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse assign fail
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p(int a) {
|
|
||||||
that.this = 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse assign fail
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p() {
|
|
||||||
x.y() = z;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse decl fail
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p() {
|
|
||||||
c [] d b = new int[4];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse new fail
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p() {
|
|
||||||
x = new Foo(10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
class id {}
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
// PA1 lex id pass
|
|
||||||
class id {}
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
// PA1 lex id pass
|
|
||||||
class id_ {}
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
// PA1 lex id pass
|
|
||||||
class id_0_1__{}
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
// PA1 lex id pass
|
|
||||||
class Class{}
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
// PA1 lex comment pass
|
|
||||||
class // comment $$ followed by \r\n
|
|
||||||
id {}
|
|
|
@ -1,2 +0,0 @@
|
||||||
// PA1 lex comment pass
|
|
||||||
class id {} // trailing comment terminated by \r\n
|
|
|
@ -1,3 +0,0 @@
|
||||||
// PA1 lex comment pass
|
|
||||||
class /* comment */ id {}
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
// PA1 lex comment pass
|
|
||||||
class /**/ id {}
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
// PA1 lex comment pass
|
|
||||||
class /*/**/ id {}
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
// PA1 lex comment pass
|
|
||||||
class /*/$*/ id {}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 lex unop pass
|
|
||||||
class id {
|
|
||||||
void p(){
|
|
||||||
int x = - b;
|
|
||||||
boolean y = !y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
// PA1 lex unop pass
|
|
||||||
class id {
|
|
||||||
void p(){
|
|
||||||
boolean x = !!!!!b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
// PA1 lex unop pass
|
|
||||||
class id {
|
|
||||||
void p(){
|
|
||||||
boolean x = 10 >- b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
// PA1 lex binop pass
|
|
||||||
class id {
|
|
||||||
void p(){
|
|
||||||
int x = 1 + 2 * 3 / 4 > 5 >= 6 < 7 <= 8 != 9 && 0 || 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
// PA1 lex binop pass
|
|
||||||
class id {
|
|
||||||
void p(){
|
|
||||||
boolean x = true && false || x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
// PA1 lex unop pass
|
|
||||||
class id {
|
|
||||||
void p(){
|
|
||||||
int y = --y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
// PA1 lex unop pass
|
|
||||||
class id {
|
|
||||||
void p(){
|
|
||||||
int x = b - - b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
// PA1 lex unop pass
|
|
||||||
class id {
|
|
||||||
void p(){
|
|
||||||
int x = b - - - -b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
// PA1 lex whitespace including tab
|
|
||||||
class Test {
|
|
||||||
/* multiple comments between
|
|
||||||
*/
|
|
||||||
|
|
||||||
// tokens
|
|
||||||
|
|
||||||
/**//* is OK */
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
// PA1 lex comment pass
|
|
||||||
class // comment followed by \n only
|
|
||||||
id {}
|
|
|
@ -1,3 +0,0 @@
|
||||||
// PA1 lex comment pass
|
|
||||||
class // comment followed by \r only
|
|
||||||
id {}
|
|
|
@ -1,2 +0,0 @@
|
||||||
// PA1 lex comment pass
|
|
||||||
class id {} // trailing comment terminated by \r
|
|
|
@ -1,2 +0,0 @@
|
||||||
// PA1 lex comment pass
|
|
||||||
class id {} // trailing comment terminated by \n
|
|
|
@ -1,2 +0,0 @@
|
||||||
// PA1 lex comment pass
|
|
||||||
class id {} // unterminated comment - no trailing \r\n
|
|
|
@ -1,2 +0,0 @@
|
||||||
// PA1 lex comment pass
|
|
||||||
class id {} /* no trailing \r\n */
|
|
|
@ -1,5 +0,0 @@
|
||||||
// PA1 parse field decl pass
|
|
||||||
class id {
|
|
||||||
public static Type x;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
// PA1 parse field decl pass
|
|
||||||
class id {
|
|
||||||
private static Type x;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
// PA1 parse field decl pass
|
|
||||||
class id {
|
|
||||||
static Type x;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
// PA1 parse field decl pass
|
|
||||||
class id {
|
|
||||||
Type x;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
// PA1 parse field decl pass
|
|
||||||
class id {
|
|
||||||
int x;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
// PA1 parse field decl pass
|
|
||||||
class id {
|
|
||||||
int[] x;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
// PA1 parse field decl pass
|
|
||||||
class id {
|
|
||||||
static void x;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
// PA1 parse method decl pass
|
|
||||||
class id {
|
|
||||||
public static void main(String[] args){}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
// PA1 parse method decl pass
|
|
||||||
class id {
|
|
||||||
private int f(int x, boolean b) {return 3;}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
// PA1 parse classdecls pass
|
|
||||||
class MainClass {
|
|
||||||
public static void main (String [] args) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
class OfItsOwn {
|
|
||||||
int A_01;
|
|
||||||
} // class OfItsOwn
|
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
// PA1 parse identifiers pass
|
|
||||||
class Keywords {
|
|
||||||
|
|
||||||
// minijava keywords are lower case only
|
|
||||||
void p() {
|
|
||||||
int format = while_1;
|
|
||||||
int Int = New;
|
|
||||||
For = Class;
|
|
||||||
FOR = RETURN;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int declare () {
|
|
||||||
boolean iF = true;
|
|
||||||
boolean Then = false;
|
|
||||||
boolean else1 = false;
|
|
||||||
|
|
||||||
if (true == false) { else1 = iF == Then; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse new pass
|
|
||||||
class MainClass {
|
|
||||||
public static void main (String [] args) {
|
|
||||||
SecondSubClass newobj = new SecondSubClass ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse new pass
|
|
||||||
class Foo {
|
|
||||||
void bar() {
|
|
||||||
int[] newarr = new int[20];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
// PA1 parse methods pass
|
|
||||||
class MainClass {
|
|
||||||
public static void main (String [] args) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
class SuperClass
|
|
||||||
{
|
|
||||||
public void setWorth (int worth){
|
|
||||||
integer = worth;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getWorth (){
|
|
||||||
return this.integer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTruth (boolean truth){
|
|
||||||
bool = truth;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getTruth (){
|
|
||||||
return this.bool;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
// PA1 parse parse pass
|
|
||||||
class MainClass {
|
|
||||||
public static void main (String [] args) {
|
|
||||||
SecondSubClass newobj = new SecondSubClass ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
class SuperClass
|
|
||||||
{
|
|
||||||
private void fillup (boolean open, int [] jar, int marble, int upto) {
|
|
||||||
|
|
||||||
int index = 0;
|
|
||||||
if (open == true) {
|
|
||||||
while ( index < upto ) {
|
|
||||||
ownjar [index] = jar [index];
|
|
||||||
jar [index] = marble;
|
|
||||||
} // while
|
|
||||||
} // if
|
|
||||||
} // fillup
|
|
||||||
|
|
||||||
} // class SuperClass
|
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
// PA1 parse refs pass
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p() {
|
|
||||||
a = true;
|
|
||||||
a [b] = c;
|
|
||||||
p ();
|
|
||||||
a.b[3] = d;
|
|
||||||
c.p(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
// PA1 parse decl pass
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
int [] a;
|
|
||||||
Test [] t;
|
|
||||||
|
|
||||||
void p() {
|
|
||||||
void x = this.t[3].a[4].p();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
// PA1 parse refs pass
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p() {
|
|
||||||
A a = 23;
|
|
||||||
boolean b = c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse assign pass
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p() {
|
|
||||||
a = b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse call pass
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p(int a, boolean b) {
|
|
||||||
p(a,b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse decl pass
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p(int a) {
|
|
||||||
Test [ ] v = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
// PA1 parse assign pass
|
|
||||||
class Test {
|
|
||||||
|
|
||||||
void p(int a) {
|
|
||||||
Test [ a + 1] = a * 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue