Skip to content

Commit ae0cf3e

Browse files
committed
Added Interpreter
1 parent f55fabb commit ae0cf3e

File tree

1 file changed

+165
-0
lines changed

1 file changed

+165
-0
lines changed
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
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

Comments
 (0)