00001 #include "javacodegeneratorvisitor.h" 00002 #include "protomake.h" 00003 00004 JavaCodeGeneratorVisitor::JavaCodeGeneratorVisitor(const char *filename) : msgCode(0), output(filename) { 00005 } 00006 00007 VisitorReturn *JavaCodeGeneratorVisitor::visitAction(Action *action) { 00008 VisitorReturn *v; 00009 return v; 00010 } 00011 00012 VisitorReturn *JavaCodeGeneratorVisitor::visitActStatement(ActStatement *actStatement) { 00013 VisitorReturn *v; 00014 return v; 00015 } 00016 00017 VisitorReturn *JavaCodeGeneratorVisitor::visitArrayReference(ArrayReference *arrayReference) { 00018 VisitorReturn *v; 00019 return v; 00020 } 00021 00022 VisitorReturn *JavaCodeGeneratorVisitor::visitArrayType(ArrayType *arrayType) { 00023 VisitorReturn *v; 00024 return v; 00025 } 00026 00027 VisitorReturn *JavaCodeGeneratorVisitor::visitAssignStatement(AssignStatement *assignStatement) { 00028 VisitorReturn *v; 00029 return v; 00030 } 00031 00032 VisitorReturn *JavaCodeGeneratorVisitor::visitAst(Ast *ast) { 00033 VisitorReturn *v; 00034 return v; 00035 } 00036 00037 VisitorReturn *JavaCodeGeneratorVisitor::visitBehavior(Behavior *behavior) { 00038 VisitorReturn *v; 00039 return v; 00040 } 00041 00042 VisitorReturn *JavaCodeGeneratorVisitor::visitBehaviorStatement(BehaviorStatement *behaviorStatement) { 00043 VisitorReturn *v; 00044 return v; 00045 } 00046 00047 VisitorReturn *JavaCodeGeneratorVisitor::visitBinaryExpression(BinaryExpression *binaryExpression) { 00048 VisitorReturn *v; 00049 return v; 00050 } 00051 00052 VisitorReturn *JavaCodeGeneratorVisitor::visitDeclaration(Declaration *declaration) { 00053 VisitorReturn *v; 00054 return v; 00055 } 00056 00057 VisitorReturn *JavaCodeGeneratorVisitor::visitDoStatement(DoStatement *doStatement) { 00058 VisitorReturn *v; 00059 return v; 00060 } 00061 00062 VisitorReturn *JavaCodeGeneratorVisitor::visitExpression(Expression *expression) { 00063 VisitorReturn *v; 00064 return v; 00065 } 00066 00067 VisitorReturn *JavaCodeGeneratorVisitor::visitExpressionList(ExpressionList *expressionList) { 00068 VisitorReturn *v; 00069 return v; 00070 } 00071 00072 VisitorReturn *JavaCodeGeneratorVisitor::visitFieldDeclaration(FieldDeclaration *fieldDeclaration) { 00073 VisitorReturn *v; 00074 return v; 00075 } 00076 00077 VisitorReturn *JavaCodeGeneratorVisitor::visitFieldReference(FieldReference *fieldReference) { 00078 VisitorReturn *v; 00079 return v; 00080 } 00081 00082 VisitorReturn *JavaCodeGeneratorVisitor::visitFieldType(FieldType *fieldType) { 00083 VisitorReturn *v; 00084 return v; 00085 } 00086 00087 VisitorReturn *JavaCodeGeneratorVisitor::visitGuard(Guard *guard) { 00088 VisitorReturn *v; 00089 return v; 00090 } 00091 00092 VisitorReturn *JavaCodeGeneratorVisitor::visitGuardedStatement(GuardedStatement *guardedStatement) { 00093 VisitorReturn *v; 00094 return v; 00095 } 00096 00097 VisitorReturn *JavaCodeGeneratorVisitor::visitGuardExpression(GuardExpression *guardExpression) { 00098 VisitorReturn *v; 00099 return v; 00100 } 00101 00102 VisitorReturn *JavaCodeGeneratorVisitor::visitGuardReceive(GuardReceive *guardReceive) { 00103 VisitorReturn *v; 00104 return v; 00105 } 00106 00107 VisitorReturn *JavaCodeGeneratorVisitor::visitGuardTimeout(GuardTimeout *guardTimeout) { 00108 VisitorReturn *v; 00109 return v; 00110 } 00111 00112 VisitorReturn *JavaCodeGeneratorVisitor::visitIdentifier(Identifier *identifier) { 00113 VisitorReturn *v; 00114 return v; 00115 } 00116 00117 VisitorReturn *JavaCodeGeneratorVisitor::visitIdentifierList(IdentifierList *identifierList) { 00118 VisitorReturn *v; 00119 return v; 00120 } 00121 00122 VisitorReturn *JavaCodeGeneratorVisitor::visitIfStatement(IfStatement *ifStatement) { 00123 VisitorReturn *v; 00124 return v; 00125 } 00126 00127 VisitorReturn *JavaCodeGeneratorVisitor::visitImport(Import *import) { 00128 VisitorReturn *v; 00129 return v; 00130 } 00131 00132 VisitorReturn *JavaCodeGeneratorVisitor::visitIntegerLiteral(IntegerLiteral *integerLiteral) { 00133 VisitorReturn *v; 00134 return v; 00135 } 00136 00137 VisitorReturn *JavaCodeGeneratorVisitor::visitLeftSide(LeftSide *leftSide) { 00138 VisitorReturn *v; 00139 return v; 00140 } 00141 00142 VisitorReturn *JavaCodeGeneratorVisitor::visitLeftSideList(LeftSideList *leftSideList) { 00143 VisitorReturn *v; 00144 return v; 00145 } 00146 00147 VisitorReturn *JavaCodeGeneratorVisitor::visitMessage(Message *message) { 00148 VisitorReturn *v; 00149 return v; 00150 } 00151 00152 VisitorReturn *JavaCodeGeneratorVisitor::visitMultipleArrayReference(MultipleArrayReference *multipleArrayReference) { 00153 VisitorReturn *v; 00154 return v; 00155 } 00156 00157 VisitorReturn *JavaCodeGeneratorVisitor::visitProcess(Process *process) { 00158 VisitorReturn *v; 00159 return v; 00160 } 00161 00162 VisitorReturn *JavaCodeGeneratorVisitor::visitProgram(Program *program) { 00163 VisitorReturn *v; 00164 output << "import java.io.*;\nimport java.net.*;\n\n\n"; 00165 program->getMessage()->visit(*this); 00166 output.close(); 00167 return v; 00168 } 00169 00170 VisitorReturn *JavaCodeGeneratorVisitor::visitRangeType(RangeType *rangeType) { 00171 VisitorReturn *v; 00172 return v; 00173 } 00174 00175 VisitorReturn *JavaCodeGeneratorVisitor::visitReceiveStatement(ReceiveStatement *receiveStatement) { 00176 VisitorReturn *v; 00177 return v; 00178 } 00179 00180 VisitorReturn *JavaCodeGeneratorVisitor::visitSendStatement(SendStatement *sendStatement) { 00181 VisitorReturn *v; 00182 return v; 00183 } 00184 00185 VisitorReturn *JavaCodeGeneratorVisitor::visitSequentialAction(SequentialAction *sequentialAction) { 00186 VisitorReturn *v; 00187 return v; 00188 } 00189 00190 VisitorReturn *JavaCodeGeneratorVisitor::visitSequentialBehavior(SequentialBehavior *sequentialBehavior) { 00191 VisitorReturn *v; 00192 return v; 00193 } 00194 00195 VisitorReturn *JavaCodeGeneratorVisitor::visitSequentialDeclaration(SequentialDeclaration *sequentialDeclaration) { 00196 VisitorReturn *v; 00197 return v; 00198 } 00199 00200 VisitorReturn *JavaCodeGeneratorVisitor::visitSequentialExpressionList(SequentialExpressionList *sequentialExpressionList) { 00201 VisitorReturn *v; 00202 return v; 00203 } 00204 00205 VisitorReturn *JavaCodeGeneratorVisitor::visitSequentialFieldDeclaration(SequentialFieldDeclaration *sequentialFieldDeclaration) { 00206 VisitorReturn *v; 00207 sequentialFieldDeclaration->getFieldDeclaration()->visit(*this); 00208 sequentialFieldDeclaration->getSimpleFieldDeclaration()->visit(*this); 00209 return v; 00210 } 00211 00212 VisitorReturn *JavaCodeGeneratorVisitor::visitSequentialGuardedStatement(SequentialGuardedStatement *sequentialGuardedStatement) { 00213 VisitorReturn *v; 00214 return v; 00215 } 00216 00217 VisitorReturn *JavaCodeGeneratorVisitor::visitSequentialIdentifierList(SequentialIdentifierList *sequentialIdentifierList) { 00218 VisitorReturn *v; 00219 return v; 00220 } 00221 00222 VisitorReturn *JavaCodeGeneratorVisitor::visitSequentialImport(SequentialImport *sequentialImport) { 00223 VisitorReturn *v; 00224 return v; 00225 } 00226 00227 VisitorReturn *JavaCodeGeneratorVisitor::visitSequentialLeftSideList(SequentialLeftSideList *sequentialLeftSideList) { 00228 VisitorReturn *v; 00229 return v; 00230 } 00231 00232 VisitorReturn *JavaCodeGeneratorVisitor::visitSequentialMessage(SequentialMessage *sequentialMessage) { 00233 VisitorReturn *v; 00234 sequentialMessage->getMessage()->visit(*this); 00235 sequentialMessage->getSimpleMessage()->visit(*this); 00236 return v; 00237 } 00238 00239 VisitorReturn *JavaCodeGeneratorVisitor::visitSequentialProcess(SequentialProcess *sequentialProcess) { 00240 VisitorReturn *v; 00241 return v; 00242 } 00243 00244 VisitorReturn *JavaCodeGeneratorVisitor::visitSequentialStatement(SequentialStatement *sequentialStatement) { 00245 VisitorReturn *v; 00246 return v; 00247 } 00248 00249 VisitorReturn *JavaCodeGeneratorVisitor::visitSimpleAction(SimpleAction *simpleAction) { 00250 VisitorReturn *v; 00251 return v; 00252 } 00253 00254 VisitorReturn *JavaCodeGeneratorVisitor::visitSimpleArrayReference(SimpleArrayReference *simpleArrayReference) { 00255 VisitorReturn *v; 00256 return v; 00257 } 00258 00259 VisitorReturn *JavaCodeGeneratorVisitor::visitSimpleBehavior(SimpleBehavior *simpleBehavior) { 00260 VisitorReturn *v; 00261 return v; 00262 } 00263 00264 VisitorReturn *JavaCodeGeneratorVisitor::visitSimpleDeclaration(SimpleDeclaration *simpleDeclaration) { 00265 VisitorReturn *v; 00266 return v; 00267 } 00268 00269 VisitorReturn *JavaCodeGeneratorVisitor::visitSimpleExpressionList(SimpleExpressionList *simpleExpressionList) { 00270 VisitorReturn *v; 00271 return v; 00272 } 00273 00274 VisitorReturn *JavaCodeGeneratorVisitor::visitSimpleFieldDeclaration(SimpleFieldDeclaration *simpleFieldDeclaration) { 00275 VisitorReturn *v; 00276 string name = simpleFieldDeclaration->getIdentifier()->getName(); 00277 string type; 00278 00279 this->stack.push_back(simpleFieldDeclaration); 00280 00281 if(simpleFieldDeclaration->getFieldType()->getType() == FieldType::BYTE) { 00282 type = "byte[]"; 00283 } else { 00284 int value = ((IntegerLiteral*)simpleFieldDeclaration->getFieldType()->getExpression())->getValue(); 00285 if(value <= 8) { 00286 type = "byte"; 00287 } else if(value <= 16) { 00288 type = "short"; 00289 } else { 00290 type = "int"; 00291 } 00292 } 00293 output << "\tprivate " << type << " " << name << ";\n\n"; 00294 00299 if(type == "byte[]") { 00300 output << "\tpublic void set" << name << "(String " << name << ") {\n"; 00301 output << "\t}\n\n"; 00302 } 00303 00307 output << "\tpublic void set" << name << "(" << type << " " << name << ") {\n"; 00308 output << "\t\tthis." << name << " = " << name << ";\n\t}\n\n"; 00309 00313 output << "\tpublic " << type << " get" << name << "() {\n\t\treturn this." << name << ";\n\t}\n\n"; 00314 00315 return v; 00316 } 00317 00318 VisitorReturn *JavaCodeGeneratorVisitor::visitSimpleGuardedStatement(SimpleGuardedStatement *simpleGuardedStatement) { 00319 VisitorReturn *v; 00320 return v; 00321 } 00322 00323 VisitorReturn *JavaCodeGeneratorVisitor::visitSimpleIdentifierList(SimpleIdentifierList *simpleIdentifierList) { 00324 VisitorReturn *v; 00325 return v; 00326 } 00327 00328 VisitorReturn *JavaCodeGeneratorVisitor::visitSimpleImport(SimpleImport *simpleImport) { 00329 VisitorReturn *v; 00330 return v; 00331 } 00332 00333 VisitorReturn *JavaCodeGeneratorVisitor::visitSimpleLeftSideList(SimpleLeftSideList *simpleLeftSideList) { 00334 VisitorReturn *v; 00335 return v; 00336 } 00337 00338 VisitorReturn *JavaCodeGeneratorVisitor::visitSimpleMessage(SimpleMessage *simpleMessage) { 00339 VisitorReturn *v; 00340 this->msgCode++; 00341 00342 output << "\n class Message" << simpleMessage->getIdentifier()->getName() << 00343 " {\n"; 00344 output << "\tpublic static final short CODE = " << this->msgCode << ";\n"; 00345 this->stack.clear(); 00346 simpleMessage->getFieldDeclaration()->visit(*this); 00347 00348 string linha1 = "\t\t\tdataOS.writeShort(CODE);\n"; 00349 string linha2 = "\t\t\tdataIS.readShort();\n"; 00350 int size = 2; 00351 string campoByte; 00352 for(vector<Ast*>::iterator i = this->stack.begin(); i != this->stack.end(); i++) { 00353 SimpleFieldDeclaration& fdecl = dynamic_cast<SimpleFieldDeclaration&>(**i); 00354 string name = fdecl.getIdentifier()->getName(); 00355 linha1 += "\t\t\tdataOS.write"; 00356 00357 if(fdecl.getFieldType()->getType() == FieldType::BYTE) { 00358 linha1 += "(this." + name + ", 0, this." + name + ".length);\n"; 00359 linha2 += "\t\t\tdataIS.readFully(this." + name + ");\n"; 00360 campoByte += " + this." + name + ".length"; 00361 } else { 00362 int value = ((IntegerLiteral*)fdecl.getFieldType()->getExpression())->getValue(); 00363 linha2 += "\t\t\tthis." + name + " = dataIS.read"; 00364 if(value <= 8) { 00365 linha1 += "Byte(this." + name + ");\n"; 00366 linha2 += "Byte();\n"; 00367 size += 1; 00368 } else if(value <= 16) { 00369 linha1 += "Short(this." + name + ");\n"; 00370 linha2 += "Short();\n"; 00371 size += 2; 00372 } else { 00373 linha1 += "Int(this." + name + ");\n"; 00374 linha2 += "Int();\n"; 00375 size += 4; 00376 } 00377 } 00378 00379 } 00380 00384 output << "\tpublic byte[] serialize() {\n"; 00385 output << "\t\tByteArrayOutputStream byteOS = null;\n"; 00386 output << "\t\tDataOutputStream dataOS = null;\n\t\thandleOut();\n\t\ttry{\n"; 00387 output << "\t\t\tbyteOS = new ByteArrayOutputStream();\n\t\t\tdataOS = new DataOutputStream(byteOS);\n\n"; 00388 output << linha1; 00389 output << "\t\t\t\n"; 00390 output << "\t\t} catch(Exception e) {e.printStackTrace();}\n"; 00391 output << "\t\treturn byteOS.toByteArray();\n"; 00392 output << "\t}\n\n"; 00393 00397 output << "\tpublic void unserialize(byte[] array) {\n"; 00398 output << "\t\tByteArrayInputStream byteIS = null;\n"; 00399 output << "\t\tDataInputStream dataIS = null;\n\t\ttry{\n"; 00400 output << "\t\t\tbyteIS = new ByteArrayInputStream(array);\n\t\t\tdataIS = new DataInputStream(byteIS);\n\n"; 00401 output << linha2; 00402 output << "\t\t\t\n"; 00403 output << "\t\t} catch(Exception e) {e.printStackTrace();}\n"; 00404 output << "\t\thandleIn();\n"; 00405 output << "\t}\n\n"; 00406 00407 00411 string call; 00412 if(simpleMessage->getHandlerOut()) { 00413 call = simpleMessage->getHandlerOut()->getName() + "();\n\t}\n\n"; 00414 } else { 00415 call = "\n\t}\n\n"; 00416 } 00417 output << "\tprivate void handleOut() {\n\t\t" << call; 00418 00422 if(simpleMessage->getHandlerIn()) { 00423 call = simpleMessage->getHandlerIn()->getName() + "();\n\t}\n\n"; 00424 } else { 00425 call = "\n\t}\n\n"; 00426 } 00427 output << "\tprivate void handleIn() {\n\t\t" << call; 00428 00429 output << "\tpublic int getSize() {\n\t\treturn " << size << campoByte << ";\n\t}\n"; 00430 00431 00432 output << "}\n"; 00433 00434 if(this->msgCode == 1) { 00435 string one = simpleMessage->getIdentifier()->getName(); 00436 output << "\nclass Process {\n" << 00437 "\tpublic void processClient() {\n" << 00438 "\t\ttry {\n" << 00439 "\t\t\tMessage" << one << " m = new Message" << one << "();\n" << 00440 "\t\t\tSocket s = new Socket(\"127.0.0.1\", 100);\n" << 00441 "\t\t\tbyte[] msg = m.serialize();\n\n" << 00442 "\t\t\ts.getOutputStream().write(msg, 0, msg.length);\n" << 00443 "\t\t\ts.close();\n" << 00444 "\t\t} catch(Exception e){e.printStackTrace();}\n" << 00445 "\t}\n\n" << 00446 "\tpublic void processServer() {\n" << 00447 "\t\ttry {\n" << 00448 "\t\tMessage" << one << " m = new Message" << one << "();\n" << 00449 "\t\tServerSocket s = new ServerSocket(100);\n" << 00450 "\t\tSocket c = s.accept();\n" << 00451 "\t\tbyte[] code = new byte[256];\n" << 00452 "\t\tc.getInputStream().read(code, 0, 2);\n" << 00453 "\t\tif(code[1] == m.CODE){\n" << 00454 "\t\tc.getInputStream().read(code, 2, m.getSize() - 2);\n" << 00455 "\t}\n" << 00456 "\tm.unserialize(code);" << 00457 "\t} catch(Exception e){e.printStackTrace();}" << 00458 "}\n\n}\n"; 00459 } 00460 00461 return v; 00462 } 00463 00464 VisitorReturn *JavaCodeGeneratorVisitor::visitSimpleProcess(SimpleProcess *simpleProcess) { 00465 VisitorReturn *v; 00466 return v; 00467 } 00468 00469 VisitorReturn *JavaCodeGeneratorVisitor::visitSimpleStatement(SimpleStatement *simpleStatement) { 00470 VisitorReturn *v; 00471 return v; 00472 } 00473 00474 VisitorReturn *JavaCodeGeneratorVisitor::visitSkipStatement(SkipStatement *skipStatement) { 00475 VisitorReturn *v; 00476 return v; 00477 } 00478 00479 VisitorReturn *JavaCodeGeneratorVisitor::visitStartStatement(StartStatement *startStatement) { 00480 VisitorReturn *v; 00481 return v; 00482 } 00483 00484 VisitorReturn *JavaCodeGeneratorVisitor::visitStatement(Statement *statement) { 00485 VisitorReturn *v; 00486 return v; 00487 } 00488 00489 VisitorReturn *JavaCodeGeneratorVisitor::visitStopStatement(StopStatement *stopStatement) { 00490 VisitorReturn *v; 00491 return v; 00492 } 00493 00494 VisitorReturn *JavaCodeGeneratorVisitor::visitStringLiteral(StringLiteral *stringLiteral) { 00495 VisitorReturn *v; 00496 return v; 00497 } 00498 00499 VisitorReturn *JavaCodeGeneratorVisitor::visitType(Type *type) { 00500 VisitorReturn *v; 00501 return v; 00502 } 00503 00504 VisitorReturn *JavaCodeGeneratorVisitor::visitUnaryExpression(UnaryExpression *unaryExpression) { 00505 VisitorReturn *v; 00506 return v; 00507 } 00508