⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testcase.java

📁 SkipOOMiniJOOL教学语言的编译器前端
💻 JAVA
字号:
package edu.ustc.cs.minijool.interp;

import org.eclipse.jdt.core.dom.*;

/**
 * 生成测试用AST的类
 * 其中一个例子createSampleAST已经给出,createTestCase请您在实验时完成,
 * 并尽可能地使您的例子能具有代表性
 */
public class TestCase {
	/**
	 * 产生一个示例的AST,对应的程序只有一个print(100)语句。
	 * @return 生成的CompilationUnit节点,即AST的根节点。
	 */
	public static ASTNode createSampleAST() {
		AST ast = AST.newAST(AST.JLS3);
		//int x,y;
		//x=--y;
		// 整型数100的AST节点
		NumberLiteral n1 = ast.newNumberLiteral("100");
		
		// print语句的AST节点
		MethodInvocation p1 = ast.newMethodInvocation();
		p1.setName(ast.newSimpleName("print"));
		p1.arguments().add(n1);
		ExpressionStatement s1 = ast.newExpressionStatement(p1);
		
		Block b1 = ast.newBlock();
		b1.statements().add(s1);
		
		MethodDeclaration m1 = ast.newMethodDeclaration();
		m1.setName(ast.newSimpleName("main"));
		m1.setBody(b1);
		
		TypeDeclaration t1 = ast.newTypeDeclaration();
		t1.setName(ast.newSimpleName("Program"));
		t1.bodyDeclarations().add(m1);
		
		CompilationUnit c1 = ast.newCompilationUnit();
		c1.types().add(t1);
		
		return c1;
	}
	
	/**
	 * 实现这个函数来获得一个测试AST
	 * @return 生成的CompilationUnit节点,即AST的根节点。
	 */
	public static ASTNode createTestCase() {
		AST ast = AST.newAST(AST.JLS3);
		
		// "a=10"的AST节点
		NumberLiteral n1 = ast.newNumberLiteral("10");
		SimpleName a1 = ast.newSimpleName("a");
		Assignment as1 = ast.newAssignment();
		as1.setLeftHandSide(a1);
		as1.setOperator(Assignment.Operator.toOperator("="));
		as1.setRightHandSide(n1);
		ExpressionStatement s1 = ast.newExpressionStatement(as1);
		
		// 中缀表达式的节点
		NumberLiteral n2 = ast.newNumberLiteral("5");
		SimpleName a3 = ast.newSimpleName("a");
		SimpleName a4 = ast.newSimpleName("a");
		PrefixExpression pf1 = ast.newPrefixExpression();
		pf1.setOperator(PrefixExpression.Operator.toOperator("+"));
		pf1.setOperand(a3);
		InfixExpression I1 = ast.newInfixExpression();
		I1.setLeftOperand(pf1);
		I1.setOperator(InfixExpression.Operator.toOperator("+"));
		I1.setRightOperand(n2);
		Assignment as2 = ast.newAssignment();
		as2.setLeftHandSide(a4);
		as2.setOperator(Assignment.Operator.toOperator("="));
		as2.setRightHandSide(I1);
		ExpressionStatement s3 = ast.newExpressionStatement(as2);
		
		//if语句
		SimpleName a5 = ast.newSimpleName("a");
		NumberLiteral n3 = ast.newNumberLiteral("0");
		InfixExpression I2 = ast.newInfixExpression();
		I2.setLeftOperand(a5);
		I2.setOperator(InfixExpression.Operator.toOperator("<"));
		I2.setRightOperand(n3);
		
		SimpleName a6 = ast.newSimpleName("a");
		SimpleName a7 = ast.newSimpleName("a");
		PrefixExpression pf2 = ast.newPrefixExpression();
		pf2.setOperator(PrefixExpression.Operator.toOperator("-"));
		pf2.setOperand(a7);
		Assignment as3 = ast.newAssignment();
		as3.setLeftHandSide(a6);
		as3.setOperator(Assignment.Operator.toOperator("="));
		as3.setRightHandSide(pf2);
		
		ExpressionStatement s4 = ast.newExpressionStatement(as3);
		Block b2 = ast.newBlock();
		b2.statements().add(s4);
		
		IfStatement ifs = ast.newIfStatement();
		ifs.setExpression(I2);
		ifs.setThenStatement(b2);
		
		
		// print语句的AST节点
		MethodInvocation p1 = ast.newMethodInvocation();
		p1.setName(ast.newSimpleName("print"));
		SimpleName a2 = ast.newSimpleName("a");
		p1.arguments().add(a2);
		ExpressionStatement s2 = ast.newExpressionStatement(p1);
		
		//while语句
		SimpleName a8 = ast.newSimpleName("a");
		NumberLiteral n4 = ast.newNumberLiteral("0");
		InfixExpression I3 = ast.newInfixExpression();
		I3.setLeftOperand(a8);
		I3.setOperator(InfixExpression.Operator.toOperator(">="));
		I3.setRightOperand(n4);
		
		MethodInvocation p2 = ast.newMethodInvocation();
		p2.setName(ast.newSimpleName("print"));
		SimpleName a9 = ast.newSimpleName("a");
		p2.arguments().add(a9);
		ExpressionStatement s5 = ast.newExpressionStatement(p2);
		
		SimpleName a10 = ast.newSimpleName("a");
		NumberLiteral n5 = ast.newNumberLiteral("1");
		InfixExpression I4 = ast.newInfixExpression();
		I4.setLeftOperand(a10);
		I4.setOperator(InfixExpression.Operator.toOperator("-"));
		I4.setRightOperand(n5);
		SimpleName a11 = ast.newSimpleName("a");
		Assignment as4 = ast.newAssignment();
		as4.setLeftHandSide(a11);
		as4.setOperator(Assignment.Operator.toOperator("="));
		as4.setRightHandSide(I4);
		ExpressionStatement s6 = ast.newExpressionStatement(as4);
		
		Block b3 = ast.newBlock();
		b3.statements().add(s5);
		b3.statements().add(s6);
		WhileStatement whl1 = ast.newWhileStatement();
		whl1.setExpression(I3);
		whl1.setBody(b3);
		
		Integer id = new Integer(1);
		
		NumberLiteral  ae = ast.newNumberLiteral();
		((NumberLiteral)ae).setToken(id.toString());
		
		SimpleName n= ast.newSimpleName("bbb");
		Assignment.Operator ao=Assignment.Operator.ASSIGN;
		Assignment masst = ast.newAssignment();
		masst.setLeftHandSide(n);
		masst.setRightHandSide(ae);
		masst.setOperator(ao);
		
		ExpressionStatement mes=ast.newExpressionStatement(masst);
		/*my code*/
		
		
		InfixExpression mie = ast.newInfixExpression();
		mie.setLeftOperand(ast.newSimpleName("a"));
		mie.setRightOperand(ast.newSimpleName("b"));
		mie.setOperator(InfixExpression.Operator.EQUALS);
		ReturnStatement mes2=ast.newReturnStatement();
		mes2.setExpression(mie);
	
		/*my code*/
		Block b1 = ast.newBlock();
		b1.statements().add(s1);
		b1.statements().add(s3);
		b1.statements().add(ifs);
		b1.statements().add(s2);
		b1.statements().add(whl1);
		b1.statements().add(mes);
		b1.statements().add(mes2);
		
		MethodDeclaration m1 = ast.newMethodDeclaration();
		m1.setName(ast.newSimpleName("main"));
		m1.setBody(b1);
		
		TypeDeclaration t1 = ast.newTypeDeclaration();
		t1.setName(ast.newSimpleName("Program"));
		t1.bodyDeclarations().add(m1);
		
		CompilationUnit c1 = ast.newCompilationUnit();
		c1.types().add(t1);
		
		return c1;
		//throw new RuntimeException("Not implemented!");
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -