📄 testcase.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 + -