|
| 1 | +package com.behavioral.interpreter; |
| 2 | + |
| 3 | +import com.squareup.javapoet.*; |
| 4 | + |
| 5 | +import javax.lang.model.element.Modifier; |
| 6 | + |
| 7 | +public class interpreter { |
| 8 | + public static void main(String[] args) { |
| 9 | + String input1 = "Context"; |
| 10 | + String input2 = "AbstractExpression"; |
| 11 | + String input3 = "OrExpression"; |
| 12 | + String input4 = "AndExpression"; |
| 13 | + String input5 = "TerminalExpression"; |
| 14 | + |
| 15 | + String packageName = "com.BehavioralDP.interpreter"; |
| 16 | + |
| 17 | +// Context class declaration |
| 18 | + ClassName Context = ClassName.get("",input1); |
| 19 | + ClassName list = ClassName.get("java.util", "List"); |
| 20 | + ClassName arrayList = ClassName.get("java.util", "ArrayList"); |
| 21 | + ClassName Boolean = ClassName.get("java.lang","Boolean"); |
| 22 | + TypeName listOfBoolean = ParameterizedTypeName.get(list,Boolean); |
| 23 | + |
| 24 | + FieldSpec operands = FieldSpec.builder(listOfBoolean,"operands",Modifier.PRIVATE) |
| 25 | + .initializer("new $T<$T>()",arrayList,Boolean.class) |
| 26 | + .build(); |
| 27 | + FieldSpec result = FieldSpec.builder(Boolean.class, "result",Modifier.PRIVATE) |
| 28 | + .initializer("null").build(); |
| 29 | + |
| 30 | + MethodSpec getOperands = MethodSpec.methodBuilder("getOperands") |
| 31 | + .addModifiers(Modifier.PUBLIC).returns(listOfBoolean) |
| 32 | + .addStatement("return $N",operands.name).build(); |
| 33 | + MethodSpec addOperand = MethodSpec.methodBuilder("addOperand") |
| 34 | + .addModifiers(Modifier.PUBLIC).returns(TypeName.VOID) |
| 35 | + .addParameter(Boolean.class, "operand") |
| 36 | + .addStatement("$N.add(operand)",operands.name).build(); |
| 37 | + |
| 38 | + TypeSpec context = TypeSpec.classBuilder(Context) |
| 39 | + .addModifiers(Modifier.PUBLIC) |
| 40 | + .addJavadoc("Context contains global information for Interpreter.") |
| 41 | + .addField(operands) |
| 42 | + .addField(result) |
| 43 | + .addMethod(getOperands) |
| 44 | + .addMethod(addOperand) |
| 45 | + .addMethod(MethodSpec.methodBuilder("isResult") |
| 46 | + .addModifiers(Modifier.PUBLIC).returns(TypeName.BOOLEAN) |
| 47 | + .addStatement("return $N",result.name).build()) |
| 48 | + .addMethod(MethodSpec.methodBuilder("setResult") |
| 49 | + .addModifiers(Modifier.PUBLIC).returns(TypeName.VOID) |
| 50 | + .addParameter(TypeName.BOOLEAN, "result") |
| 51 | + .addStatement("this.$N = result",result.name).build()) |
| 52 | + .build(); |
| 53 | + JavaFile class1 = JavaFile.builder(packageName,context).skipJavaLangImports(true).build(); |
| 54 | + |
| 55 | + |
| 56 | + |
| 57 | +// AbstractExpression class declaration |
| 58 | + ClassName AbstractExpression = ClassName.get("",input2); |
| 59 | + MethodSpec interpret = MethodSpec.methodBuilder("interpret") |
| 60 | + .addModifiers(Modifier.ABSTRACT).returns(TypeName.VOID) |
| 61 | + .addParameter(Context, "context") |
| 62 | + .build(); |
| 63 | + |
| 64 | + TypeSpec abstractExp = TypeSpec.classBuilder(AbstractExpression) |
| 65 | + .addModifiers(Modifier.PUBLIC,Modifier.ABSTRACT) |
| 66 | + .addJavadoc("AbstractExpresion defines interface for interpretation. Interface must be used by" + |
| 67 | + " TerminalExpression and NonTerminalExpression.") |
| 68 | + .addMethod(interpret).build(); |
| 69 | + JavaFile class2 = JavaFile.builder(packageName,abstractExp).skipJavaLangImports(true).build(); |
| 70 | + |
| 71 | +// OrExpression class declaration |
| 72 | + ClassName OrExpression = ClassName.get("",input3); |
| 73 | + FieldSpec firstAbsExp = FieldSpec.builder(AbstractExpression, "firstAbstractExpression",Modifier.PRIVATE).build(); |
| 74 | + FieldSpec secondAbsExp = FieldSpec.builder(AbstractExpression, "secondAbstractExpression",Modifier.PRIVATE).build(); |
| 75 | + TypeSpec orExp = TypeSpec.classBuilder(OrExpression) |
| 76 | + .superclass(AbstractExpression) |
| 77 | + .addModifiers(Modifier.PUBLIC) |
| 78 | + .addJavadoc("OrExpression implements AbstractExpression for logical OR grammar expression") |
| 79 | + .addField(firstAbsExp) |
| 80 | + .addField(secondAbsExp) |
| 81 | + .addMethod(MethodSpec.constructorBuilder() |
| 82 | + .addModifiers(Modifier.PUBLIC) |
| 83 | + .addParameter(AbstractExpression, "firstAbstractExpression") |
| 84 | + .addParameter(AbstractExpression, "secondAbstractExpression") |
| 85 | + .addStatement("this.$N = firstAbstractExpression",firstAbsExp) |
| 86 | + .addStatement("this.$N = secondAbstractExpression",secondAbsExp) |
| 87 | + .build()) |
| 88 | + .addMethod(MethodSpec.methodBuilder(interpret.name) |
| 89 | + .addModifiers(Modifier.PUBLIC).returns(TypeName.VOID) |
| 90 | + .addParameter(Context, "context") |
| 91 | + .addStatement("$N.$N(context)",firstAbsExp.name,interpret.name) |
| 92 | + .addStatement("$N.$N(context)",secondAbsExp.name,interpret.name) |
| 93 | + .addCode("\n") |
| 94 | + .addStatement("$T $N = context.$N()",listOfBoolean,operands.name,getOperands.name) |
| 95 | + .addCode("\n") |
| 96 | + .addStatement("Boolean firstOperand = operands.get(0)") |
| 97 | + .addStatement("Boolean secondOperand = operands.get(1)") |
| 98 | + .addCode("\n") |
| 99 | + .addStatement("$T $N = firstOperand || secondOperand",Boolean,result.name) |
| 100 | + .addStatement("$N.setResult($N)",context.name,result.name) |
| 101 | + .build()) |
| 102 | + .build(); |
| 103 | + JavaFile class3 = JavaFile.builder(packageName,orExp).skipJavaLangImports(true).build(); |
| 104 | + |
| 105 | +// OrExpression class declaration |
| 106 | + ClassName AndExpression = ClassName.get("",input4); |
| 107 | + TypeSpec andExp = TypeSpec.classBuilder(AndExpression) |
| 108 | + .superclass(AbstractExpression) |
| 109 | + .addModifiers(Modifier.PUBLIC) |
| 110 | + .addJavadoc("AndExpression implements AbstractExpression for logical AND grammar expression") |
| 111 | + .addField(firstAbsExp) |
| 112 | + .addField(secondAbsExp) |
| 113 | + .addMethod(MethodSpec.constructorBuilder() |
| 114 | + .addModifiers(Modifier.PUBLIC) |
| 115 | + .addParameter(AbstractExpression, "firstAbstractExpression") |
| 116 | + .addParameter(AbstractExpression, "secondAbstractExpression") |
| 117 | + .addStatement("this.$N = firstAbstractExpression",firstAbsExp) |
| 118 | + .addStatement("this.$N = secondAbstractExpression",secondAbsExp) |
| 119 | + .build()) |
| 120 | + .addMethod(MethodSpec.methodBuilder(interpret.name) |
| 121 | + .addModifiers(Modifier.PUBLIC).returns(TypeName.VOID) |
| 122 | + .addParameter(Context, "context") |
| 123 | + .addStatement("$N.$N(context)",firstAbsExp.name,interpret.name) |
| 124 | + .addStatement("$N.$N(context)",secondAbsExp.name,interpret.name) |
| 125 | + .addCode("\n") |
| 126 | + .addStatement("$T $N = context.$N()",listOfBoolean,operands.name,getOperands.name) |
| 127 | + .addCode("\n") |
| 128 | + .addStatement("Boolean firstOperand = operands.get(0)") |
| 129 | + .addStatement("Boolean secondOperand = operands.get(1)") |
| 130 | + .addCode("\n") |
| 131 | + .addStatement("$T $N = firstOperand && secondOperand",Boolean,result.name) |
| 132 | + .addStatement("$N.setResult($N)",context.name,result.name) |
| 133 | + .build()) |
| 134 | + .build(); |
| 135 | + JavaFile class4 = JavaFile.builder(packageName,andExp).skipJavaLangImports(true).build(); |
| 136 | + |
| 137 | +// TerminalExpression class declaration |
| 138 | + ClassName TerminalExpression = ClassName.get("",input5); |
| 139 | + FieldSpec data = FieldSpec.builder(boolean.class,"data",Modifier.PRIVATE).build(); |
| 140 | + TypeSpec termExp = TypeSpec.classBuilder(TerminalExpression) |
| 141 | + .superclass(AbstractExpression) |
| 142 | + .addModifiers(Modifier.PUBLIC) |
| 143 | + .addJavadoc("TerminalExpresion implements AbstractExpression for literal symbol in grammar.") |
| 144 | + .addField(data) |
| 145 | + .addMethod(MethodSpec.constructorBuilder() |
| 146 | + .addModifiers(Modifier.PUBLIC) |
| 147 | + .addParameter(boolean.class,"data") |
| 148 | + .addStatement("this.$N = data",data.name) |
| 149 | + .build()) |
| 150 | + .addMethod(MethodSpec.methodBuilder(interpret.name) |
| 151 | + .addModifiers(Modifier.PUBLIC).returns(TypeName.VOID) |
| 152 | + .addParameter(Context,"context") |
| 153 | + .addStatement("context.$N(this.$N)",addOperand.name,data.name) |
| 154 | + .build()) |
| 155 | + .build(); |
| 156 | + JavaFile class5 = JavaFile.builder(packageName,termExp).skipJavaLangImports(true).build(); |
| 157 | + |
| 158 | + |
| 159 | + System.out.println(class1); |
| 160 | + System.out.println(class2 ); |
| 161 | + System.out.println(class3); |
| 162 | + System.out.println(class4); |
| 163 | + System.out.println(class5); |
| 164 | + } |
| 165 | +} |
0 commit comments