2016-04-07 33 views
2

Amacım, anahtar deyimlerini kullanarak işlevimi basitleştirmektir, ancak anahtar deyimlerine bir kod parçasının nasıl ekleneceğini anlayamıyorum. printf("("); ve infixTree(node->left);'da eklerseniz, her bir durumda bu kod satırlarını eklediysem beklenmedik zamanlarda çağırmazlar mı?Bir anahtar ifadesine yapılan açıklamaların dönüştürülmesi

İşte şu anki işlevim.

void infixTree(ExpNode* node) 
{ 
    if(node->type==INTEGER) 
    { 
     printf("%d",node->value.value.iVal); 
     return; 
    } 

    if(node->type==DOUBLE) 
    { 
     printf("%f",node->value.value.dVal); 
     return; 
    } 

    if(node->type==SYMBOL) 
    { 
     printf("%s",node->symbol); 
     return; 
    } 

    printf("("); 
    infixTree(node->left); 

    if(node->type==ADD_OP) 
    { 
     printf(" + "); 
    } 
    else if(node->type==SUB_OP) 
    { 
     printf(" - "); 
    } 
    else if(node->type==MUL_OP) 
    { 
     printf(" * "); 
    } 
    else if(node->type==DIV_OP) 
    { 
     printf("/"); 
    } 
    else if(node->type==MOD_OP) 
    { 
     printf(" %% "); 
    } 
    else if(node->type==ASSIGN_OP) 
    { 
     printf(" = "); 
    } 

    infixTree(node->right); 
    printf(")"); 
} 

ben

printf("("); 
infixTree(node->left); 

Benim işlevini kullanarak anahtar ifadeleri şu anda şöyle yer alacağını bilmiyorum.

void infixTree(ExpNode* node) 
{ 
    switch(node->type) 
    { 
     case INTEGER : 
      printf("%d", node->value.value.iVal); 
      return; 
     case DOUBLE : 
      printf("%f", node->value.value.dVal); 
      return; 
     case SYMBOL : 
      printf*%s", node->symbol); 
      return; 
    } 

    switch(node->type) 
    { 
     case ADD_OP: 
      printf("("); 
      infixTree(node->left); 
      printf(" + "); 
      break; 
     case SUB_OP: 
      printf("("); 
      infixTree(node->left); 
      printf(" - "); 
      break; 
     case MUL_OP : 
      printf("("); 
      infixTree(node->left); 
      printf(" * "); 
      break; 
     case DIV_OP : 
      printf("("); 
      infixTree(node->left); 
      printf("/"); 
      break; 
     case MOD_OP : 
      printf("("); 
      infixTree(node->left); 
      printf(" %% "); 
      break; 
     case ASSIGN_OP : 
      printf("("); 
      infixTree(node->left); 
      printf(" = "); 
      break; 
    } 

    infixTree(node->right); 
    printf(")"); 
} 
+0

yazardı. Orada olmalıydı. Düzenlenmiş – FatFockFrank

+0

İki farklı elsif merdiveni gibi iki farklı 'switch'es olabilir. –

+0

Tamam, düzenledim, Çözüm işe yarar mı? – FatFockFrank

cevap

4

Ben tüm

printf("("); 
infixTree(node->left); 

şube geçiş dahil etmek gerekli olduğunu sanmıyorum.

sıkıştırma uğruna

, bunun bir hata olduğunu, Evet

printf("("); 
infixTree(node->left); 
switch(node->type){ 
    case ADD_OP: 
     printf(" + "); 
     break; 
    case SUB_OP: 
     printf(" - "); 
     break; 
    case MUL_OP : 
     printf(" * "); 
     break; 
    case DIV_OP : 
     printf("/"); 
     break; 
    case MOD_OP : 
     printf(" %% "); 
     break; 
    case ASSIGN_OP : 
     printf(" = "); 
     break; 
} 
+0

İkinci anahtar deyimindeki ilk durumdan hemen önce mi? – FatFockFrank

+1

@FatFockFrank Evet. Düzenlenmiş cevabımı gör –

+0

Başka bir soru. Bu durumlar numaralandırma değerleridir. Her anahtarda tüm numaralandırma değerlerini dahil etmediğimde bir hata alıyorum. 'uyarı: 'INTEGER' sayım değeri 'anahtarında işlenmez'. Bunu görmezden gelebilir miyim? – FatFockFrank

İlgili konular