本文整理汇总了C++中Memory::addVariable方法的典型用法代码示例。如果您正苦于以下问题:C++ Memory::addVariable方法的具体用法?C++ Memory::addVariable怎么用?C++ Memory::addVariable使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Memory
的用法示例。
在下文中一共展示了Memory::addVariable方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: execute
/**
* Analyse sémantique
* Pseudo algorithme :
* Avec `programme`, faire l'analyse sémantique !
* -> Faire toutes les déclarations (utiliser les méthodes déjà codées)
* -> Faire toutes les instructions :
* ** read : s'assurer que la variable a bien été déclarée
* ** write : s'assurer que l'expression a bien été déclarée (& instanciée dans le cas d'une variable)
* ** opération = : s'assurer que le membre de gauche est bien une variable DECLAREE / s'assurer que tous les membres de droites sont soit des constantes, soit des variables déclarées et instanciées !!
*/
bool Semantique::execute(Memory& mem)
{
#ifdef DEBUG
cout << "------------------------------" << endl;
cout << "\t###\tDébut de l'analyse sémantique (option -a)\t###" << endl;
#endif
vector<Declaration*> liste_declaration = mem.getDeclarations();
vector<Instruction*> liste_instruction = mem.getInstructions();
#ifdef DEBUG
cout << "Parcours des déclarations (" << liste_declaration.size() << ") !" << endl;
#endif
// on parcourt toutes les déclarations
for (auto const& it : liste_declaration)
{
DeclarationVar* declaVar = dynamic_cast<DeclarationVar*> (it);
DeclarationConst* declaConst = dynamic_cast<DeclarationConst*> (it);
if (declaVar != NULL)
{
// c'est une déclaration de variable(s)
vector<Identificateur*> idents = declaVar->getIdents();
for (auto const& itvar : idents)
{
string ident = *itvar;
bool ok = mem.addVariable(itvar);
if (!ok)
{
#ifdef DEBUG
cout << "# La variable " << ident << " a déjà été déclarée." << endl;
#endif
return false;
}
}
}
else if (declaConst != NULL)
{
// c'est une déclaration de constante(s)
vector<constante> consts = declaConst->getConstantes();
for (auto const& itconst : consts)
{
string ident = *(itconst.ident);
int value = *(itconst.value);
bool ok = mem.addConstante(ident, value);
if (!ok)
{
#ifdef DEBUG
cout << "# La constante " << ident << " (value=" << value << ") a déjà été déclarée." << endl;
#endif
return false;
}
}
}
else
{
// ???
}
}
#ifdef DEBUG
mem.displayMemory();
cout << "------------------------------" << endl;
cout << "Parcours des instructions (" << liste_instruction.size() << ") !" << endl;
#endif
// on parcourt toutes les instructions
for (auto const& it : liste_instruction)
{
Affectation* affectation = dynamic_cast<Affectation*> (it);
Lecture* lecture = dynamic_cast<Lecture*> (it);
Ecriture* ecriture = dynamic_cast<Ecriture*> (it);
// expression -> faire une fonction récursive (ou itérative, osef) pour récupérer tous les identificateurs d'une expression !
if (affectation != NULL)
{
// c'est une affectation
// get expression -> récupérer tous les identificateurs (get idents) de l'expression et checker s'ils existent (déclarées) et si pour les variables ils ont bien été instanciés
Expression* expr = affectation->getExpression();
//.........这里部分代码省略.........