#include <typecheckervisitor.h>
Inheritance diagram for TypeCheckerVisitor:
|
Definition at line 19 of file typecheckervisitor.h.
00019 {} |
|
Implements Visitor. Definition at line 9 of file typecheckervisitor.cpp.
00009 { 00010 VisitorReturn *v= new VisitorReturn; 00011 return v; 00012 } |
|
Implements Visitor. Definition at line 14 of file typecheckervisitor.cpp. References ActStatement::getExpression(), ActStatement::getIdentifier(), Identifier::getName(), Ast::getPosition(), Type::getTypeCode(), insert, Type::INTEGER, stack, symbolTable, Type::TIMEOUT, VisitorReturn::type, Ast::visit(), and Identifier::visit().
00014 { 00015 VisitorReturn *v= new VisitorReturn; 00016 Type *t = new Type(actStatement->getIdentifier()->getPosition(), Type::TIMEOUT); 00017 string str = actStatement->getIdentifier()->getName(); 00018 00019 map<string, Type*>::iterator i = this->symbolTable.find("@" + str); 00020 if(i != this->symbolTable.end()) { 00021 t = this->symbolTable["@" + str]; 00022 this->symbolTable.erase("@" + str); 00023 } 00024 00025 this->stack.push_back(t); 00026 this->insert = true; 00027 v = actStatement->getIdentifier()->visit(*this); 00028 this->insert = false; 00029 this->stack.pop_back(); 00030 00031 v = actStatement->getExpression()->visit(*this); 00032 if(v->type->getTypeCode() != Type::INTEGER) { 00033 cerr << "Expression não é INTEGER\n"; 00034 exit(1); 00035 } 00036 00037 return v; // essse return nao serve pra nada 00038 } |
|
Implements Visitor. Definition at line 40 of file typecheckervisitor.cpp.
00040 { 00041 VisitorReturn *v= new VisitorReturn; 00042 return v; 00043 } |
|
Implements Visitor. Definition at line 45 of file typecheckervisitor.cpp.
00045 { 00046 VisitorReturn *v= new VisitorReturn; 00047 return v; 00048 } |
|
Implements Visitor. Definition at line 50 of file typecheckervisitor.cpp. References AssignStatement::getExpressionList(), AssignStatement::getLeftSideList(), Type::getTypeCode(), VisitorReturn::type, and Ast::visit().
00050 { 00051 VisitorReturn *v1, *v2; 00052 00053 v1 = assignStatement->getLeftSideList()->visit(*this); 00054 v2 = assignStatement->getExpressionList()->visit(*this); 00055 00056 if(v1->type->getTypeCode() != v2->type->getTypeCode()) { 00057 cerr << "Tipos de expressoes não são iguais\n"; 00058 exit(1); 00059 } 00060 00061 return v1; // essse return nao serve pra nada 00062 } |
|
Implements Visitor. Definition at line 64 of file typecheckervisitor.cpp.
00064 { 00065 VisitorReturn *v= new VisitorReturn; 00066 return v; 00067 } |
|
Implements Visitor. Definition at line 69 of file typecheckervisitor.cpp.
00069 { 00070 VisitorReturn *v= new VisitorReturn; 00071 return v; 00072 } |
|
Implements Visitor. Definition at line 74 of file typecheckervisitor.cpp. References Type::BEHAVIOR, BehaviorStatement::getBehavior(), BehaviorStatement::getExpressionList(), Type::getTypeCode(), VisitorReturn::type, Ast::visit(), and Identifier::visit().
00074 { 00075 VisitorReturn *v= new VisitorReturn; 00076 00077 v = behaviorStatement->getBehavior()->visit(*this); 00078 if(v->type->getTypeCode() != Type::BEHAVIOR) { 00079 cerr << "Behavior não é BEHAVIOR\n"; 00080 exit(1); 00081 } 00082 00083 behaviorStatement->getExpressionList()->visit(*this); 00084 00085 return v; 00086 } |
|
Implements Visitor. Definition at line 88 of file typecheckervisitor.cpp. References Type::BOOLEAN, BinaryExpression::getLeftExpression(), BinaryExpression::getOp(), Ast::getPosition(), BinaryExpression::getRightExpression(), Type::getTypeCode(), Type::INTEGER, VisitorReturn::type, and Ast::visit().
00088 { 00089 VisitorReturn *v1, *v2; 00090 string op; 00091 Type *type; 00092 00093 v1 = binaryExpression->getLeftExpression()->visit(*this); 00094 v2 = binaryExpression->getRightExpression()->visit(*this); 00095 op = binaryExpression->getOp(); 00096 00097 if(v1->type->getTypeCode() != v2->type->getTypeCode()) { 00098 cerr << "Tipos de expressões binárias não são iguais\n"; 00099 exit(1); 00100 } 00101 00102 if((op == "&") || (op == "|")) { 00103 type = new Type(binaryExpression->getPosition(),Type::BOOLEAN); 00104 if(v1->type->getTypeCode() != Type::BOOLEAN) { 00105 cerr << "Operadores booleanos aplicados a expressões não booleanas\n"; 00106 exit(1); 00107 } 00108 } else { 00109 if((op == "+") || (op == "-") || (op == "*") || (op == "/")) { 00110 type = new Type(binaryExpression->getPosition(),Type::INTEGER); 00111 } else { 00112 type = new Type(binaryExpression->getPosition(),Type::BOOLEAN); 00113 } 00114 if((v1->type->getTypeCode() != Type::INTEGER) && (op != "=")) { 00115 cerr << "Operadores aritmeticos aplicados a expressões não inteiras\n"; 00116 exit(1); 00117 } 00118 } 00119 00120 v1->type = type; 00121 00122 return v1; 00123 } |
|
Implements Visitor. Definition at line 125 of file typecheckervisitor.cpp.
00125 { 00126 VisitorReturn *v= new VisitorReturn; 00127 return v; 00128 } |
|
Implements Visitor. Definition at line 130 of file typecheckervisitor.cpp. References DoStatement::getGuardedStatement(), and Ast::visit().
00130 { 00131 VisitorReturn *v= new VisitorReturn; 00132 00133 v = doStatement->getGuardedStatement()->visit(*this); 00134 00135 return v; 00136 } |
|
Implements Visitor. Definition at line 138 of file typecheckervisitor.cpp.
00138 { 00139 VisitorReturn *v= new VisitorReturn; 00140 return v; 00141 } |
|
Implements Visitor. Definition at line 143 of file typecheckervisitor.cpp.
00143 { 00144 VisitorReturn *v= new VisitorReturn; 00145 return v; 00146 } |
|
Implements Visitor. Definition at line 148 of file typecheckervisitor.cpp.
00148 { 00149 VisitorReturn *v= new VisitorReturn; 00150 return v; 00151 } |
|
Implements Visitor. Definition at line 153 of file typecheckervisitor.cpp. References FieldReference::getFieldId(), FieldReference::getMsgId(), Identifier::getName(), symbolTable, and VisitorReturn::type.
00153 { 00154 VisitorReturn *v= new VisitorReturn; 00155 string id; 00156 00157 id = fieldReference->getMsgId()->getName() + "." + fieldReference->getFieldId()->getName(); 00158 map<string, Type*>::iterator i = this->symbolTable.find(id); 00159 if(i == this->symbolTable.end()) { 00160 cerr << "FieldReference não existe\n"; 00161 exit(1); 00162 } 00163 00164 v->type = this->symbolTable[id]; 00165 00166 return v; 00167 } |
|
Implements Visitor. Definition at line 169 of file typecheckervisitor.cpp. References FieldType::BIT, FieldType::getExpression(), SimpleMessage::getIdentifier(), Identifier::getName(), Ast::getPosition(), FieldType::getType(), Type::getTypeCode(), IntegerLiteral::getValue(), Type::INTEGER, stack, Type::STRING, symbolTable, and VisitorReturn::type.
00169 { 00170 VisitorReturn *v= new VisitorReturn; 00171 SimpleMessage *sm; 00172 Identifier *id; 00173 string str; 00174 bool ehInteger = true; 00175 IntegerLiteral *il = 0; 00176 00177 if(typeid(*fieldType->getExpression()) == typeid(Identifier)) { 00178 ehInteger = false; 00179 sm = (SimpleMessage *)this->stack[this->stack.size()-1]; 00180 id = (Identifier *)fieldType->getExpression(); 00181 str = sm->getIdentifier()->getName() + "." + id->getName(); 00182 00183 map<string, Type*>::iterator i = this->symbolTable.find(str); 00184 if(i == this->symbolTable.end()) { 00185 cerr << "FieldReference não existe\n"; 00186 exit(1); 00187 } 00188 Type *t = (Type *)this->symbolTable[str]; 00189 if(t->getTypeCode()==Type::STRING) { 00190 cerr << "Quantificador invalido, tipo bit requerido\n"; 00191 exit(1); 00192 } 00193 00194 } else if(typeid(*fieldType->getExpression()) != typeid(IntegerLiteral)) { 00195 cerr << "Quantificador invalido, constante ou nome de campo requerido\n"; 00196 exit(1); 00197 } else { 00198 il = (IntegerLiteral *)fieldType->getExpression(); 00199 } 00200 00201 if(fieldType->getType() == FieldType::BIT && !ehInteger) { 00202 cerr << "Se for bit só pode ser constante\n"; 00203 exit(1); 00204 } else if(ehInteger && (il->getValue() > 32) && (fieldType->getType() == FieldType::BIT)) { 00205 cerr << "So pode ter no maximo 32 bits\n"; 00206 exit(1); 00207 } 00208 00209 Type *type = new Type(fieldType->getPosition(), fieldType->getType() == FieldType::BIT ? Type::INTEGER : Type::STRING); 00210 v->type = type; 00211 return v; 00212 } |
|
Implements Visitor. Definition at line 214 of file typecheckervisitor.cpp.
00214 { 00215 VisitorReturn *v= new VisitorReturn; 00216 return v; 00217 } |
|
Implements Visitor. Definition at line 219 of file typecheckervisitor.cpp.
00219 { 00220 VisitorReturn *v= new VisitorReturn; 00221 return v; 00222 } |
|
Implements Visitor. Definition at line 224 of file typecheckervisitor.cpp. References Type::BOOLEAN, GuardExpression::getExpression(), Type::getTypeCode(), VisitorReturn::type, and Ast::visit().
00224 { 00225 VisitorReturn *v= new VisitorReturn; 00226 00227 v = guardExpression->getExpression()->visit(*this); 00228 if(v->type->getTypeCode() != Type::BOOLEAN) { 00229 cerr << "A guarda tem que ser booleana\n"; 00230 exit(1); 00231 } 00232 return v; 00233 } |
|
Implements Visitor. Definition at line 235 of file typecheckervisitor.cpp. References GuardReceive::getReceiveStatement(), and ReceiveStatement::visit().
00235 { 00236 VisitorReturn *v= new VisitorReturn; 00237 guardReceive->getReceiveStatement()->visit(*this); 00238 return v; 00239 } |
|
Implements Visitor. Definition at line 241 of file typecheckervisitor.cpp. References forgetIt, GuardTimeout::getIdentifier(), Type::getTypeCode(), Type::TIMEOUT, VisitorReturn::type, and Identifier::visit().
00241 { 00242 VisitorReturn *v= new VisitorReturn; 00243 00244 this->forgetIt = true; 00245 v = guardTimeout->getIdentifier()->visit(*this); 00246 this->forgetIt = false; 00247 00248 if(v->type->getTypeCode() != Type::TIMEOUT) { 00249 cerr << "O identifier tem que ser um timeout\n"; 00250 exit(1); 00251 } 00252 00253 return v; 00254 } |
|
Implements Visitor. Definition at line 256 of file typecheckervisitor.cpp. References forgetIt, Identifier::getName(), Ast::getPosition(), insert, stack, symbolTable, Type::TIMEOUT, and VisitorReturn::type.
00256 { 00257 VisitorReturn *v = new VisitorReturn; 00258 Type *t = 0; 00259 00260 if(this->insert) { 00261 t = (Type *)this->stack[this->stack.size()-1]; 00262 map<string, Type*>::iterator i = this->symbolTable.find(identifier->getName()); 00263 if(i != this->symbolTable.end()) { 00264 cerr << "identifier jah declarado\n"; 00265 exit(1); 00266 } 00267 this->symbolTable[identifier->getName()] = t; 00268 v->type = t; 00269 } else { 00270 string str = identifier->getName(); 00271 map<string, Type*>::iterator i = this->symbolTable.find(str); 00272 if(i == this->symbolTable.end()) { 00273 if(!this->forgetIt) { 00274 cerr << "identifier nao declarado\n"; 00275 exit(1); 00276 } else { 00277 str = "@" + str; 00278 this->symbolTable[str] = new Type(identifier->getPosition(), Type::TIMEOUT); 00279 } 00280 } 00281 t = this->symbolTable[str]; 00282 v->type = t; 00283 } 00284 return v; 00285 } |
|
Implements Visitor. Definition at line 287 of file typecheckervisitor.cpp.
00287 { 00288 VisitorReturn *v= new VisitorReturn; 00289 return v; 00290 } |
|
Implements Visitor. Definition at line 292 of file typecheckervisitor.cpp. References IfStatement::getGuardedStatement(), and Ast::visit().
00292 { 00293 VisitorReturn *v= new VisitorReturn; 00294 ifStatement->getGuardedStatement()->visit(*this); 00295 return v; 00296 } |
|
Implements Visitor. Definition at line 298 of file typecheckervisitor.cpp.
00298 { 00299 VisitorReturn *v= new VisitorReturn; 00300 return v; 00301 } |
|
Implements Visitor. Definition at line 735 of file typecheckervisitor.cpp. References Ast::getPosition(), Type::INTEGER, and VisitorReturn::type.
00735 { 00736 VisitorReturn *v= new VisitorReturn; 00737 v->type = new Type(integerLiteral->getPosition(),Type::INTEGER); 00738 return v; 00739 } |
|
Implements Visitor. Definition at line 303 of file typecheckervisitor.cpp.
00303 { 00304 VisitorReturn *v= new VisitorReturn; 00305 return v; 00306 } |
|
Implements Visitor. Definition at line 308 of file typecheckervisitor.cpp.
00308 { 00309 VisitorReturn *v= new VisitorReturn; 00310 return v; 00311 } |
|
Implements Visitor. Definition at line 313 of file typecheckervisitor.cpp.
00313 { 00314 VisitorReturn *v= new VisitorReturn; 00315 return v; 00316 } |
|
Implements Visitor. Definition at line 318 of file typecheckervisitor.cpp. References Type::ARRAY, MultipleArrayReference::getArrayReference(), MultipleArrayReference::getExpression(), Ast::getPosition(), Type::getTypeCode(), Type::INTEGER, VisitorReturn::type, and Ast::visit().
00318 { 00319 VisitorReturn *v= new VisitorReturn; 00320 v = multipleArrayReference->getArrayReference()->visit(*this); 00321 if(v->type->getTypeCode() != Type::ARRAY) { 00322 cerr << "A referencia do array deve ser um ARRAY\n"; 00323 exit(1); 00324 } 00325 v = multipleArrayReference->getExpression()->visit(*this); 00326 if(v->type->getTypeCode() != Type::INTEGER) { 00327 cerr << "A expression do array deve ser um INTEGER\n"; 00328 exit(1); 00329 } 00330 Type *type = new Type(multipleArrayReference->getPosition(), Type::ARRAY); 00331 v->type = type; 00332 return v; 00333 } |
|
Implements Visitor. Definition at line 335 of file typecheckervisitor.cpp.
00335 { 00336 VisitorReturn *v= new VisitorReturn; 00337 return v; 00338 } |
|
Implements Visitor. Definition at line 340 of file typecheckervisitor.cpp. References Program::getBehavior(), Program::getImport(), Program::getMessage(), Program::getProcess(), Type::PROCESS, symbolTable, and Ast::visit().
00340 { 00341 VisitorReturn *v= new VisitorReturn; 00342 if(program->getImport()) 00343 program->getImport()->visit(*this); 00344 if(program->getBehavior()) 00345 program->getBehavior()->visit(*this); 00346 00347 program->getMessage()->visit(*this); 00348 program->getProcess()->visit(*this); 00349 00350 00351 map<string, Type*>::iterator i = this->symbolTable.begin(); 00352 bool mainExists = false; 00353 00354 while(i != this->symbolTable.end()) { 00355 if((*i).first[0] == '@') { 00356 cerr << "Existem identificadores invalidos\n"; 00357 exit(1); 00358 } 00359 if(!mainExists && ((*i).first == "main") && ((*i).second->getTypeCode() == Type::PROCESS)) { 00360 mainExists = true; 00361 } 00362 i++; 00363 } 00364 00365 if(!mainExists) { 00366 cerr << "Tem que haver um processo chamado \"main\"\n"; 00367 exit(1); 00368 } 00369 00370 return v; 00371 } |
|
Implements Visitor. Definition at line 373 of file typecheckervisitor.cpp.
00373 { 00374 VisitorReturn *v= new VisitorReturn; 00375 return v; 00376 } |
|
Implements Visitor. Definition at line 378 of file typecheckervisitor.cpp. References Type::ADDRESS, ReceiveStatement::getAddrId(), ReceiveStatement::getMsgId(), Type::getTypeCode(), Type::MESSAGE, VisitorReturn::type, and Identifier::visit().
00378 { 00379 VisitorReturn *v= new VisitorReturn; 00380 v = receiveStatement->getMsgId()->visit(*this); 00381 if(v->type->getTypeCode() != Type::MESSAGE) { 00382 cerr << "O identifier não representa uma mensagem\n"; 00383 exit(1); 00384 } 00385 v = receiveStatement->getAddrId()->visit(*this); 00386 if(v->type->getTypeCode() != Type::ADDRESS) { 00387 cerr << "O identifier não representa um ADDRESS\n"; 00388 exit(1); 00389 } 00390 return v; 00391 } |
|
Implements Visitor. Definition at line 393 of file typecheckervisitor.cpp. References Type::ADDRESS, SendStatement::getAddrId(), SendStatement::getMsgId(), Type::getTypeCode(), Type::MESSAGE, VisitorReturn::type, and Identifier::visit().
00393 { 00394 VisitorReturn *v= new VisitorReturn; 00395 v = sendStatement->getMsgId()->visit(*this); 00396 if(v->type->getTypeCode() != Type::MESSAGE) { 00397 cerr << "O identifier não representa uma mensagem\n"; 00398 exit(1); 00399 } 00400 v = sendStatement->getAddrId()->visit(*this); 00401 if(v->type->getTypeCode() != Type::ADDRESS) { 00402 cerr << "O identifier não representa um ADDRESS\n"; 00403 exit(1); 00404 } 00405 return v; 00406 } |
|
Implements Visitor. Definition at line 408 of file typecheckervisitor.cpp. References SequentialAction::getAction(), SequentialAction::getSimpleAction(), SimpleAction::visit(), and Ast::visit().
00408 { 00409 VisitorReturn *v= new VisitorReturn; 00410 sequentialAction->getAction()->visit(*this); 00411 sequentialAction->getSimpleAction()->visit(*this); 00412 return v; 00413 } |
|
Implements Visitor. Definition at line 415 of file typecheckervisitor.cpp. References SequentialBehavior::getBehavior(), SequentialBehavior::getSimpleBehavior(), SimpleBehavior::visit(), and Ast::visit().
00415 { 00416 VisitorReturn *v= new VisitorReturn; 00417 sequentialBehavior->getBehavior()->visit(*this); 00418 sequentialBehavior->getSimpleBehavior()->visit(*this); 00419 return v; 00420 } |
|
Implements Visitor. Definition at line 422 of file typecheckervisitor.cpp. References SequentialDeclaration::getDeclaration(), SequentialDeclaration::getSimpleDeclaration(), SimpleDeclaration::visit(), and Ast::visit().
00422 { 00423 VisitorReturn *v= new VisitorReturn; 00424 00425 if(sequentialDeclaration->getDeclaration()) 00426 sequentialDeclaration->getDeclaration()->visit(*this); 00427 if(sequentialDeclaration->getSimpleDeclaration()) 00428 sequentialDeclaration->getSimpleDeclaration()->visit(*this); 00429 return v; 00430 } |
|
Implements Visitor. Definition at line 432 of file typecheckervisitor.cpp. References SequentialExpressionList::getExpressionList(), SequentialExpressionList::getSimpleExpressionList(), stack, VisitorReturn::type, SimpleExpressionList::visit(), and Ast::visit().
00432 { 00433 VisitorReturn *v= new VisitorReturn; 00434 00435 v = sequentialExpressionList->getExpressionList()->visit(*this); 00436 this->stack.push_back(v->type); 00437 v = sequentialExpressionList->getSimpleExpressionList()->visit(*this); 00438 this->stack.push_back(v->type); 00439 00440 return v; 00441 } |
|
Implements Visitor. Definition at line 443 of file typecheckervisitor.cpp. References SequentialFieldDeclaration::getFieldDeclaration(), SequentialFieldDeclaration::getSimpleFieldDeclaration(), SimpleFieldDeclaration::visit(), and Ast::visit().
00443 { 00444 VisitorReturn *v= new VisitorReturn; 00445 00446 sequentialFieldDeclaration->getFieldDeclaration()->visit(*this); 00447 sequentialFieldDeclaration->getSimpleFieldDeclaration()->visit(*this); 00448 00449 return v; 00450 } |
|
Implements Visitor. Definition at line 452 of file typecheckervisitor.cpp. References SequentialGuardedStatement::getGuardedStatement(), SequentialGuardedStatement::getSimpleGuardedStatement(), SimpleGuardedStatement::visit(), and Ast::visit().
00452 { 00453 VisitorReturn *v= new VisitorReturn; 00454 00455 sequentialGuardedStatement->getGuardedStatement()->visit(*this); 00456 sequentialGuardedStatement->getSimpleGuardedStatement()->visit(*this); 00457 00458 return v; 00459 } |
|
Implements Visitor. Definition at line 461 of file typecheckervisitor.cpp. References SequentialIdentifierList::getIdentifierList(), SequentialIdentifierList::getSimpleIdentifierList(), SimpleIdentifierList::visit(), and Ast::visit().
00461 { 00462 VisitorReturn *v= new VisitorReturn; 00463 00464 sequentialIdentifierList->getIdentifierList()->visit(*this); 00465 sequentialIdentifierList->getSimpleIdentifierList()->visit(*this); 00466 00467 return v; 00468 } |
|
Implements Visitor. Definition at line 470 of file typecheckervisitor.cpp. References SequentialImport::getImport(), SequentialImport::getSimpleImport(), SimpleImport::visit(), and Ast::visit().
00470 { 00471 VisitorReturn *v= new VisitorReturn; 00472 00473 sequentialImport->getImport()->visit(*this); 00474 sequentialImport->getSimpleImport()->visit(*this); 00475 00476 return v; 00477 } |
|
Implements Visitor. Definition at line 479 of file typecheckervisitor.cpp. References SequentialLeftSideList::getLeftSideList(), SequentialLeftSideList::getSimpleLeftSideList(), stack, VisitorReturn::type, SimpleLeftSideList::visit(), and Ast::visit().
00479 { 00480 VisitorReturn *v= new VisitorReturn; 00481 00482 v = sequentialLeftSideList->getLeftSideList()->visit(*this); 00483 this->stack.push_back(v->type); 00484 v = sequentialLeftSideList->getSimpleLeftSideList()->visit(*this); 00485 this->stack.push_back(v->type); 00486 00487 return v; 00488 } |
|
Implements Visitor. Definition at line 490 of file typecheckervisitor.cpp. References SequentialMessage::getMessage(), SequentialMessage::getSimpleMessage(), SimpleMessage::visit(), and Ast::visit().
00490 { 00491 VisitorReturn *v= new VisitorReturn; 00492 sequentialMessage->getMessage()->visit(*this); 00493 sequentialMessage->getSimpleMessage()->visit(*this); 00494 00495 return v; 00496 } |
|
Implements Visitor. Definition at line 498 of file typecheckervisitor.cpp. References SequentialProcess::getProcess(), SequentialProcess::getSimpleProcess(), SimpleProcess::visit(), and Ast::visit().
00498 { 00499 VisitorReturn *v= new VisitorReturn; 00500 sequentialProcess->getProcess()->visit(*this); 00501 sequentialProcess->getSimpleProcess()->visit(*this); 00502 return v; 00503 } |
|
Implements Visitor. Definition at line 505 of file typecheckervisitor.cpp. References SequentialStatement::getSimpleStatement(), SequentialStatement::getStatement(), and Ast::visit().
00505 { 00506 VisitorReturn *v= new VisitorReturn; 00507 00508 sequentialStatement->getStatement()->visit(*this); 00509 sequentialStatement->getSimpleStatement()->visit(*this); 00510 00511 return v; 00512 } |
|
Implements Visitor. Definition at line 514 of file typecheckervisitor.cpp. References SimpleAction::getGuard(), SimpleAction::getStatement(), and Ast::visit().
00514 { 00515 VisitorReturn *v= new VisitorReturn; 00516 00517 simpleAction->getGuard()->visit(*this); 00518 simpleAction->getStatement()->visit(*this); 00519 00520 return v; 00521 } |
|
Implements Visitor. Definition at line 523 of file typecheckervisitor.cpp. References Type::ARRAY, SimpleArrayReference::getExpression(), SimpleArrayReference::getIdentifier(), Ast::getPosition(), ArrayType::getType(), Type::getTypeCode(), Type::INTEGER, VisitorReturn::type, Ast::visit(), and Identifier::visit().
00523 { 00524 VisitorReturn *v1, *v2; 00525 00526 v1 = simpleArrayReference->getIdentifier()->visit(*this); 00527 if(v1->type->getTypeCode() != Type::ARRAY) { 00528 cerr << "Identifier tem que ser ARRAY\n"; 00529 exit(1); 00530 } 00531 v2 = simpleArrayReference->getExpression()->visit(*this); 00532 if(v2->type->getTypeCode() != Type::INTEGER) { 00533 cerr << "Expressao tem que ser INTEGER\n"; 00534 exit(1); 00535 } 00536 ArrayType *arrayType = (ArrayType*)v1->type; 00537 00538 Type *type = new Type(simpleArrayReference->getPosition(), arrayType->getType()->getTypeCode()); 00539 v1->type = type; 00540 00541 return v1; 00542 } |
|
Implements Visitor. Definition at line 544 of file typecheckervisitor.cpp. References Type::BEHAVIOR, SimpleBehavior::getIdentifierList(), Ast::getPosition(), insert, stack, and Ast::visit().
00544 { 00545 VisitorReturn *v= new VisitorReturn; 00546 Type *type = new Type(simpleBehavior->getPosition(), Type::BEHAVIOR); 00547 00548 this->stack.push_back(type); 00549 this->insert = true; 00550 simpleBehavior->getIdentifierList()->visit(*this); 00551 this->stack.pop_back(); 00552 this->insert = false; 00553 return v; 00554 } |
|
Implements Visitor. Definition at line 556 of file typecheckervisitor.cpp. References SimpleDeclaration::getExpression(), SimpleDeclaration::getIdentifierList(), SimpleDeclaration::getType(), Type::getTypeCode(), insert, stack, VisitorReturn::type, Type::visit(), and Ast::visit().
00556 { 00557 VisitorReturn *v1, *v2; 00558 00559 this->stack.push_back(simpleDeclaration->getType()); 00560 this->insert = true; 00561 00562 simpleDeclaration->getIdentifierList()->visit(*this); 00563 this->stack.pop_back(); 00564 this->insert = false; 00565 00566 00567 v2 = simpleDeclaration->getType()->visit(*this); 00568 if(simpleDeclaration->getExpression()) { 00569 v1 = simpleDeclaration->getExpression()->visit(*this); 00570 00571 if(v1->type->getTypeCode() != v2->type->getTypeCode()) { 00572 cerr << "Declaracao e expressao tem tipos diferentes\n"; 00573 exit(1); 00574 } 00575 } 00576 00577 return v2; // esse retormo nao servepra nada 00578 } |
|
Implements Visitor. Definition at line 580 of file typecheckervisitor.cpp. References SimpleExpressionList::getExpression(), and Ast::visit().
00580 { 00581 VisitorReturn *v= new VisitorReturn; 00582 v = simpleExpressionList->getExpression()->visit(*this); 00583 return v; 00584 } |
|
Implements Visitor. Definition at line 586 of file typecheckervisitor.cpp. References SimpleFieldDeclaration::getExpression(), SimpleFieldDeclaration::getFieldType(), SimpleFieldDeclaration::getIdentifier(), SimpleMessage::getIdentifier(), Identifier::getName(), Type::getTypeCode(), stack, symbolTable, VisitorReturn::type, Ast::visit(), and FieldType::visit().
00586 { 00587 VisitorReturn *v1, *v2; 00588 SimpleMessage *sm; 00589 string str; 00590 00591 00592 v2 = simpleFieldDeclaration->getFieldType()->visit(*this); 00593 00594 if(simpleFieldDeclaration->getExpression()) { 00595 v1 = simpleFieldDeclaration->getExpression()->visit(*this); 00596 00597 if(v1->type->getTypeCode() != v2->type->getTypeCode()) { 00598 cerr << "Declaracao e expressao tem tipos diferentes\n"; 00599 exit(1); 00600 } 00601 } 00602 00603 sm = (SimpleMessage *)this->stack[this->stack.size()-1]; 00604 str = sm->getIdentifier()->getName() + "." + simpleFieldDeclaration->getIdentifier()->getName(); 00605 00606 map<string, Type*>::iterator i = this->symbolTable.find(str); 00607 if(i != this->symbolTable.end()) { 00608 cerr << "Nome do campo já existe\n"; 00609 exit(1); 00610 } 00611 00612 this->symbolTable[str] = v2->type; 00613 00614 return v2; // esse retormo nao servepra nada 00615 } |
|
Implements Visitor. Definition at line 617 of file typecheckervisitor.cpp. References Type::BOOLEAN, SimpleGuardedStatement::getExpression(), SimpleGuardedStatement::getStatement(), Type::getTypeCode(), VisitorReturn::type, and Ast::visit().
00617 { 00618 VisitorReturn *v= new VisitorReturn; 00619 00620 // \_:D_/ 00621 simpleGuardedStatement->getStatement()->visit(*this); 00622 00623 v = simpleGuardedStatement->getExpression()->visit(*this); 00624 if(v->type->getTypeCode() != Type::BOOLEAN) { 00625 cerr << "A guarda tem que conter uma expressao booleana \\_:D_/\n"; 00626 exit(1); 00627 } 00628 00629 return v; 00630 } |
|
Implements Visitor. Definition at line 632 of file typecheckervisitor.cpp. References SimpleIdentifierList::getIdentifier(), and Identifier::visit().
00632 { 00633 VisitorReturn *v= new VisitorReturn; 00634 simpleIdentifierList->getIdentifier()->visit(*this); 00635 return v; 00636 } |
|
Implements Visitor. Definition at line 638 of file typecheckervisitor.cpp.
00638 { 00639 VisitorReturn *v= new VisitorReturn; // \_:)_/ \_:D_/ 00640 return v; 00641 } |
|
Implements Visitor. Definition at line 643 of file typecheckervisitor.cpp. References SimpleLeftSideList::getLeftSide(), and Ast::visit().
00643 { 00644 VisitorReturn *v= new VisitorReturn; 00645 v = simpleLeftSideList->getLeftSide()->visit(*this); 00646 return v; 00647 } |
|
Implements Visitor. Definition at line 649 of file typecheckervisitor.cpp. References SimpleMessage::getFieldDeclaration(), SimpleMessage::getIdentifier(), Ast::getPosition(), insert, Type::MESSAGE, stack, Ast::visit(), and Identifier::visit().
00649 { 00650 VisitorReturn *v= new VisitorReturn; 00651 Type *type = new Type(simpleMessage->getPosition(), Type::MESSAGE); 00652 00653 this->stack.push_back(simpleMessage); 00654 this->stack.push_back(type); 00655 this->insert = true; 00656 simpleMessage->getIdentifier()->visit(*this); 00657 this->stack.pop_back(); 00658 this->insert = false; 00659 00660 simpleMessage->getFieldDeclaration()->visit(*this); 00661 this->stack.pop_back(); 00662 00663 return v; 00664 } |
|
Implements Visitor. Definition at line 666 of file typecheckervisitor.cpp. References SimpleProcess::getAction(), SimpleProcess::getDeclaration(), SimpleProcess::getIdentifier(), Identifier::getName(), Ast::getPosition(), insert, Type::PROCESS, stack, symbolTable, Ast::visit(), and Identifier::visit().
00666 { 00667 VisitorReturn *v= new VisitorReturn; 00668 Type *type = new Type(simpleProcess->getPosition(), Type::PROCESS); 00669 00670 this->stack.push_back(type); 00671 this->insert = true; 00672 v = simpleProcess->getIdentifier()->visit(*this); 00673 this->stack.pop_back(); 00674 this->insert = false; 00675 00676 string str = "@"; 00677 00678 str += simpleProcess->getIdentifier()->getName(); 00679 map<string, Type*>::iterator i = this->symbolTable.find(str); 00680 if(i != this->symbolTable.end()) { 00681 this->symbolTable.erase(str); 00682 } 00683 00684 simpleProcess->getDeclaration()->visit(*this); 00685 simpleProcess->getAction()->visit(*this); 00686 00687 return v; 00688 } |
|
Implements Visitor. Definition at line 690 of file typecheckervisitor.cpp.
00690 { 00691 VisitorReturn *v= new VisitorReturn; 00692 return v; 00693 } |
|
Implements Visitor. Definition at line 695 of file typecheckervisitor.cpp.
00695 { 00696 VisitorReturn *v= new VisitorReturn; 00697 return v; 00698 } |
|
Implements Visitor. Definition at line 700 of file typecheckervisitor.cpp. References StartStatement::getIdentifier(), Identifier::getName(), Ast::getPosition(), Type::getTypeCode(), Type::PROCESS, symbolTable, VisitorReturn::type, and Identifier::visit().
00700 { 00701 VisitorReturn *v= new VisitorReturn; 00702 string str = "@"; 00703 00704 str += startStatement->getIdentifier()->getName(); 00705 map<string, Type*>::iterator i = this->symbolTable.find(str); 00706 if(i == this->symbolTable.end()) { 00707 this->symbolTable[str] = new Type(startStatement->getPosition(),Type::PROCESS); 00708 } else { 00709 v = startStatement->getIdentifier()->visit(*this); 00710 if(v->type->getTypeCode() != Type::PROCESS) { 00711 cerr << "Identificador tem que ser um processo \\_:D_/\n"; 00712 exit(1); 00713 } 00714 } 00715 00716 return v; 00717 } |
|
Implements Visitor. Definition at line 719 of file typecheckervisitor.cpp.
00719 { 00720 VisitorReturn *v= new VisitorReturn; 00721 return v; 00722 } |
|
Implements Visitor. Definition at line 724 of file typecheckervisitor.cpp.
00724 { 00725 VisitorReturn *v= new VisitorReturn; 00726 return v; 00727 } |
|
Implements Visitor. Definition at line 729 of file typecheckervisitor.cpp. References Ast::getPosition(), Type::STRING, and VisitorReturn::type.
00729 { 00730 VisitorReturn *v= new VisitorReturn; 00731 v->type = new Type(stringLiteral->getPosition(),Type::STRING); 00732 return v; 00733 } |
|
Implements Visitor. Definition at line 741 of file typecheckervisitor.cpp. References VisitorReturn::type.
00741 { 00742 VisitorReturn *v= new VisitorReturn; 00743 v->type = type; 00744 return v; 00745 } |
|
Implements Visitor. Definition at line 747 of file typecheckervisitor.cpp. References Type::BOOLEAN, UnaryExpression::getExpression(), UnaryExpression::getOp(), Type::getTypeCode(), Type::INTEGER, VisitorReturn::type, and Ast::visit().
00747 { 00748 VisitorReturn *v= new VisitorReturn; 00749 string op; 00750 00751 v = unaryExpression->getExpression()->visit(*this); 00752 op = unaryExpression->getOp(); 00753 00754 if(op == "~") { 00755 if(v->type->getTypeCode() != Type::BOOLEAN) { 00756 cerr << "Operadores booleanos aplicados a expressões não booleanas\n"; 00757 exit(1); 00758 } 00759 } else { 00760 if(v->type->getTypeCode() != Type::INTEGER) { 00761 cerr << "Operadores aritmeticos aplicados a expressões não inteiras\n"; 00762 exit(1); 00763 } 00764 } 00765 00766 00767 return v; 00768 } |
|
Definition at line 15 of file typecheckervisitor.h. Referenced by visitGuardTimeout(), and visitIdentifier(). |
|
Definition at line 14 of file typecheckervisitor.h. Referenced by visitActStatement(), visitIdentifier(), visitSimpleBehavior(), visitSimpleDeclaration(), visitSimpleMessage(), and visitSimpleProcess(). |
|
Definition at line 16 of file typecheckervisitor.h. Referenced by visitActStatement(), visitFieldType(), visitIdentifier(), visitSequentialExpressionList(), visitSequentialLeftSideList(), visitSimpleBehavior(), visitSimpleDeclaration(), visitSimpleFieldDeclaration(), visitSimpleMessage(), and visitSimpleProcess(). |
|
Definition at line 13 of file typecheckervisitor.h. Referenced by visitActStatement(), visitFieldReference(), visitFieldType(), visitIdentifier(), visitProgram(), visitSimpleFieldDeclaration(), visitSimpleProcess(), and visitStartStatement(). |