2009-12-07 2 views
1

У меня сложное время, соответствующее фигурным скобкам в этом коде. Он продолжает указывать «else» без ошибки «if», но не уверен, как должен читаться синтаксис. Если кто-то может помочь, это будет оценено по достоинству. Вот код:Подходящие фигурные скобки

private void compileFactor() { 
     boolean its_a_variable = theInfo.isVar(); 
     if (isIdent(theToken)) { 
      String ident = theToken; 
      theToken = t.token();  // handles var and const cases! 

      IdentInfo theInfo = symTable.lookup(ident); 
     } 


      boolean its_a_variable = theInfo.isVar(); 
      int theAddr = theInfo.getAddr(); 
      boolean isGlobal = theInfo.getIsGlobal(); 
      int constValue = theInfo.getValue(); 

      if (its_a_variable) { // pld12: CHANGE THIS!! 
       int theAddr = theInfo.getAddr(); 
       boolean isGlobal = theInfo.getIsGlobal(); 
       if (theAddr == -1) t.error("undeclared identifier used in expr: "+ident); 
       if (isGlobal) cs.emit(Machine.LOAD, theAddr); 
       else cs.emit(Machine.LOADF, theAddr); 
      } else { 
       int constValue = theInfo.getValue(); 
       if (constValue = null) t.error("undeclared identifier used in expr: "+ident); 


       else { 
        cs.emitLOADI(theNumber); 
       } 


      else if (isNumber(theToken)) { 
       int theNumber = new Integer(theToken).intValue(); 
       cs.emitLOADINT(theNumber); 
       theToken = t.token(); 
      } 
      else if (equals(theToken, "(")) { // nothing to do to generate code! 
       accept("("); 
       compileExpr(); 
       accept(")"); 
      } 


     } 
+3

Почему вы не можете использовать текстовый редактор с простым синтаксисом пониманием, чтобы отслеживать все соответствующие открывающие и закрывающие скобки? – artdanil

+0

Пожалуйста, скажите, какой язык это. –

ответ

5

Это else if происходит после else:

 else if (isNumber(theToken)) { 
      int theNumber = new Integer(theToken).intValue(); 
      cs.emitLOADINT(theNumber); 
      theToken = t.token(); 
     } 

Edit: фиксированные и отступы

private void compileFactor() { 
    if (isIdent(theToken)) { 
     String ident = theToken; 
     theToken = t.token();  // handles var and const cases! 

     IdentInfo theInfo = symTable.lookup(ident); 

     boolean its_a_variable = theInfo.isVar(); 
     int theAddr = theInfo.getAddr(); 
     boolean isGlobal = theInfo.getIsGlobal(); 
     int constValue = theInfo.getValue(); 

     if (its_a_variable) { // pld12: CHANGE THIS!! 
      int theAddr = theInfo.getAddr(); 
      boolean isGlobal = theInfo.getIsGlobal(); 
      if (theAddr == -1) t.error("undeclared identifier used in expr: "+ident); 
      if (isGlobal) cs.emit(Machine.LOAD, theAddr); 
      else cs.emit(Machine.LOADF, theAddr); 
     } else { 
      int constValue = theInfo.getValue(); 
      if (constValue = null) { 
       t.error("undeclared identifier used in expr: "+ident); 
      } else { 
       cs.emitLOADI(theNumber); 
      } 
     } 
    } else if (isNumber(theToken)) { 
     int theNumber = new Integer(theToken).intValue(); 
     cs.emitLOADINT(theNumber); 
     theToken = t.token(); 
    } else if (equals(theToken, "(")) { // nothing to do to generate code! 
     accept("("); 
     compileExpr(); 
     accept(")"); 
    } 
} 
+0

Это ** else if (isNumber (theToken)) ** может быть для ** if (isIdent (theToken)) {**, "else if" после "else" не имеет смысла. – YOU

+0

Я догадался, что это не имеет смысла; у него отсутствует закрывающая скобка для другого над ним. – Tordek

+0

Да, в самом деле, его необходимо закрыть скобки – YOU

0

Я подозреваю, что это ваша проблема.

  if (constValue = null) t.error("undeclared identifier used in expr: "+ident); 


      else { 
       cs.emitLOADI(theNumber); 
      } 

EDIT Если это будет?

  if (constValue = null) { 
       t.error("undeclared identifier used in expr: "+ident); 
      } else { 
       cs.emitLOADI(theNumber); 
      } 
+0

, вы можете иметь несколько строк между предложением if-else, даже если часть if используется в качестве встроенного оператора. Пробелы по большей части не имеют значения. –

+0

Да, но, основываясь на отступе, это выглядело очень похоже, если бы предназначалось для присоединения к этому другому. –

2

бы предложить, если у вас возникли проблемы, соответствующие фигурные скобки, начать новое определение функции, только начните с добавления потока управления и ветвления (ifs, elses, ...) и используйте фигурные скобки на каждом блоке if/else if/else - даже на одном лайнере.

Когда вы получите это право, добавьте остальные функции.
Когда брекеты становятся без проблем, начните пропускать их для одного лайнера.

+4

... или никогда не начинать пропускать скобки вообще. Некоторые люди находят код более четким, если всегда есть скобки вокруг блоков кода. – Guffa

+0

yup - лично всегда оставляйте их, но не хотите начинать святую войну :) – seanb

0

Несколько блокпостов

Я думаю, вам нужно будет закрыть скобки перед тем IsNumber (theToken)

}} else if (isNumber(theToken)) { 

и могут быть вам не нужна скобка после этой строки?

IdentInfo theInfo = symTable.lookup(ident); 
} 

Может быть, весь код такой?

private void compileFactor() { 
    boolean its_a_variable = theInfo.isVar(); 
    if (isIdent(theToken)) { 
     String ident = theToken; 
     theToken = t.token();  // handles var and const cases! 
     IdentInfo theInfo = symTable.lookup(ident); 

     boolean its_a_variable = theInfo.isVar(); 
     int theAddr = theInfo.getAddr(); 
     boolean isGlobal = theInfo.getIsGlobal(); 
     int constValue = theInfo.getValue(); 

     if (its_a_variable) { // pld12: CHANGE THIS!! 
      int theAddr = theInfo.getAddr(); 
      boolean isGlobal = theInfo.getIsGlobal(); 
      if (theAddr == -1) t.error("undeclared identifier used in expr: "+ident); 
      if (isGlobal) cs.emit(Machine.LOAD, theAddr); 
      else cs.emit(Machine.LOADF, theAddr); 
     } else { 
      int constValue = theInfo.getValue(); 
      if (constValue = null) 
       t.error("undeclared identifier used in expr: "+ident); 
      else { 
        cs.emitLOADI(theNumber); 
      } 
     } 
    } else if (isNumber(theToken)) { 
     int theNumber = new Integer(theToken).intValue(); 
     cs.emitLOADINT(theNumber); 
     theToken = t.token(); 
    } else if (equals(theToken, "(")) { // nothing to do to generate code! 
     accept("("); 
     compileExpr(); 
     accept(")"); 
    } 
} 
4

Я не хочу, чтобы начать размещение скобки священной войны, но именно поэтому я предпочитаю «открывающую скобку в следующей строке» идиоме. Я могу визуально отобразить открывающую и закрывающую фигурные скобки, даже если у меня нет IDE, чтобы помочь мне.

С учетом этого, IDE - ваш лучший друг здесь.

Я хотел рекомендацию немедленно при добавлении открытия и закрытия скобки к блоку перед заполнением его.

Сторонясь блоками одной строки без скобок помогут. На это не так много усилий добавить.

+0

+! «Я не хочу начинать связывание связки», да, да, вы ... –

+0

Просто излагаю свою причину, вот и все. – duffymo

1

Это то, что структура выглядит следующим образом:

private void compileFactor() { 
    if (...) { 
    ... 
    } 
    if (...) { 
    ... 
    if (...) ... 
    if (...) ... 
    else ... 
    } else { 
    if (...) ... 
    else { 
     ... 
* } else if (...) { 
     ... 
    } else if (...) { 
     ... 
    } 
    } 

Где я поставил *, вы имеете еще следуя за другой. Просто добавив еще одну скобку до этого момента, она не исправит ее, так как это добавит else после другого.

Итак, в ваших условиях есть что-то принципиально неправильное, и вы в значительной степени должны переосмыслить его с самого начала.

Добавить скобки во всех операторах if, чтобы вы были уверены, что они действительно начинаются и заканчиваются там, где вы их ожидаете.

0

Если вы используете Visual Studio, вы можете использовать + «]» клавиши CTRL, чтобы соответствовать брекеты

0

Попробуйте комментируя следующий код:

function blah(){ //start function 
    if(...){  //open if 1 
    for(...){ //open for 

     //do something  

    }//close for 
    } //close if 1 
}//close function 

Я делаю это в Flash, хотя в некоторых langueages это пугает вещи.

Удачи вам!

0

Отмеченный код имеет 6 '}' и 7 '{'.

Последние «{» утверждение следующей выдержки является тот, который, как представляется, не имеет соответствия «}»

  else cs.emit(Machine.LOADF, theAddr); 
    } else { 
Смежные вопросы