Changeset 772


Ignore:
Timestamp:
May 28, 2003, 9:14:15 AM (18 years ago)
Author:
luba
Message:
  • Processing of spaces in words is corrected;
  • comments are added;
File:
1 edited

Legend:

Unmodified
Added
Removed
  • to-imperative/trunk/library/Convert/to_int.cc

    r767 r772  
    2222  //пропускаем произвольное количество пробелов, если
    2323  //последовательность термов Char
    24   //
    25   //FIXME: А если там не пробел, а \n, \r, \v, \t или что там ещё разрешено?
    26   //И надо добавить соответствующие тесты.
    27   //Кроме того, если уж есть функция is_not_space(), почему бы её здесь не
    28   //использовать?
     24  //Eсли там не пробел, а \n, \r, \v, \t или не символ-число,
     25  // то выдать сообщение об ошибке
    2926  //
    3027  if (t->get_type() == type_char) {
    3128    for (; ;)
    32       if (((Char*)t)->to_wchar_t() != ' ') {
     29      if (((Char*)t)->is_not_space()) {
    3330        break;
    3431      }
     
    5653  //и у него нет знака
    5754  //
    58   //FIXME: не надо вызывать is_number() каждый раз по новой.  Надо либо доп.
    59   //переменную использовать, либо switch.  Также очень неплохо вместо
    60   //обозначения возвращаемых значений цифрами завести enum.
    61   //
    62   if ((t->get_type() == type_word) )
    63     if (((Word*)t)->is_number() == -1)
     55  if ((t->get_type() == type_word) ) {
     56    int res_is_number = ((Word*)t)->is_number();
     57    if (res_is_number == minus)
    6458       flag = -1;
    6559    else
    66     if(((Word*)t)->is_number() == 1)
     60    if(res_is_number == plus)
    6761      flag = 1;
    6862    else
    69     if(((Word*)t)->is_number() == 2)
     63    if(res_is_number == positive_number)
    7064      flag = 0;
    7165    else
    7266      retfail;
    73    
     67  }
    7468  if (t->get_type() == type_short_int ||t->get_type() == type_word ) {
    7569    t++;
     
    8579    //выражения, которое будет построено из исходного
    8680    //
    87     //FIXME: зачем два раза проверяется is_not_space()?
    88     //
    8981    if (t->get_type() == type_char) {
    9082
     
    9890            len += 1;
    9991          }
    100         }
    101         else {
    102           if (((Char*)t)->is_not_space())
    103             retfail;
    104           else
    105             continue;   
    106         }
     92        }
     93        else 
     94          retfail;
    10795      }
    10896      //после символов-чисел допускается любое количество пробелов,
    10997      // не допускаются пробелы между символами-числами
    11098      //
    111       //FIXME: зачем внутри цикла всё время присваиваем t = temp?  Зачем вообще
    112       //нужна temp?
    113       //Что будет, если очередной символ -- это " "?  Надо добавить
    114       //соответствующий тест.
    115       //
    11699      else {
    117         Term* temp = t;
    118         while (temp->get_type()==type_char){
    119           if (((Char*)temp)->is_not_space() == false){
    120             temp++; t = temp;
     100        t++;
     101        while (t->get_type()==type_char){
     102          if (((Char*)t)->is_not_space() == false){
     103            t++;
    121104          }
    122105          else {
     
    151134    //длине выражения, которое будет построено из исходного
    152135    //
    153     //FIXME: что, если в начале слова идёт пробел, а у нас уже накоплены цифры?
    154     //Аналогично с концом слова.
    155     //
    156136    else
    157137      if (t->get_type() == type_word){
    158         if (((Word*)t)->is_number() == 1 ||((Word*)t)->is_number() == -1 )
     138        if (((Word*)t)->is_number() == plus ||
     139            ((Word*)t)->is_number() == minus )
     140          retfail;
     141        //не допускаются пробелы в начале слова, если слово не первое в
     142        //выражении
     143        //
     144        if ( ((Word*)t)->has_space() == 1 )
     145          retfail;
     146        //не допускаются пробелы в конце слова, если оно не последнее
     147        //в выражении
     148        //
     149        if ( (((Word*)t)->has_space() == 2) && (t != e_Exp.get_last()) )
    159150          retfail;
    160151
Note: See TracChangeset for help on using the changeset viewer.