Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Μπορεί κάποιος να με βοηθήσει στο σκεπτικό για μετατροπή της
IF ELSE
σε απλή IF (χωρις ELSE)

 

γνωρίζοντας τον κώδικα της πρώτης περίπτωσης?
 

void ProcessIfElseStmt(AstNode *p, int lev,int lvalue, int leftchild)
{
symbol *sn,*lhs;
int savedLoc1, savedLoc2,currentLoc;
emitComment("if:condition");
CodeGeneration(p->pAstNode[0],lev+1,lvalue,TRUE);
lhs=pop_vs();
emitRM("LD",ac,m_offset,mp,"Load the result to AC");
m_offset++;

savedLoc1= emitSkip(1);

CodeGeneration(p->pAstNode[1],lev+1,lvalue,TRUE);
    
savedLoc2=emitSkip(1);

currentLoc=emitSkip(0);
emitBackup(savedLoc1);
emitRM_Abs("JEQ",ac,currentLoc,"if:jmp to else");
emitRestore();

CodeGeneration(p->pAstNode[2],lev+1,lvalue,TRUE);

currentLoc=emitSkip(0);
emitBackup(savedLoc2);
emitRM_Abs("LDA",pc,currentLoc,"if:jmp to endif");
emitRestore();


discard_symbol(lhs);

}


εγω κάνω αυτό αλλά δε δουλεύει :/

 

void ProcessIfStmt(AstNode *p, int lev,int lvalue)
{
   symbol *sn,*lhs;
   int savedLoc1,currentLoc;
   emitComment("if:condition");
   CodeGeneration(p->pAstNode[0],lev+1,lvalue,FALSE);
   lhs=pop_vs();
   emitRM("LD",ac,m_offset,mp,"Load the result to AC");
   m_offset++;
   
   savedLoc1= emitSkip(1); //if
  
   CodeGeneration(p->pAstNode[1],lev+1,lvalue,FALSE);
   
   currentLoc=emitSkip(0);
   emitBackup(savedLoc1);
   emitRM_Abs("LDA",pc,currentLoc,"if:jmp to endif");
   emitRestore();

   
   discard_symbol(lhs);
}

Ελπίζω να καταλαβαίνεται τι κάνει κάθε μια συνάρτηση απο την επικεφαλίδα.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...