Changeset 868


Ignore:
Timestamp:
Jun 25, 2003, 9:50:36 AM (18 years ago)
Author:
luba
Message:
  • comments are corrected;
File:
1 edited

Legend:

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

    r865 r868  
    1414namespace Convert
    1515{
    16 /*
    17 1. Ищем цифру, + или -.
    18     - Если встретили + или -, переходим к шагу 2.
    19     - Если встретили цифру, переходим к шагу 3.
    20     - Если встретили пробел, ищем дальше.
    21     - Если встретили что-то ещё, то $fail.
    22     - Если кончилась строка, полученная из текущего терма, берём след.
    23     - Если выражение кончилось, то $fail.
    24 2. Ищем первую цифру.
    25     - Сдвигаемся на символ влево.
    26     - Если это цифра, переходим к шагу 3.
    27     - Если что-то ещё, то $fail.
    28     - Если не смогли сдвинуться, потому что строка кончилась, берём
    29       след. терм.
    30     - Если выражение кончилось, то $fail.
    31 3. Ищем первую ненулевую цифру.
    32     - Если встретили ненулевую цифру, переходим к шагу 4.
    33     - Если встретили 0, ищем дальше.
    34     - Если встретили пробел, то кладём текущую строку во вспомогательную
    35       и переходим к последнему шагу.
    36     - Если встретили что-то ещё, то $fail.
    37     - Если кончилась строка, полученная из текущего терма, берём след.
    38     - Если выражение кончилось, то возвращаем ShortInt::create_expr(0).
    39 4. Считываем цифры и только цифры.
    40     - Если встретили цифру, повторяем шаг 4.
    41     - Если встретили пробел, то приплюсовываем текущую строку ко
    42       вспомогательной и переходим к последнему шагу.
    43     - Если встретили что-то ещё, то $fail.
    44     - Если кончилась строка, полученная из текущего терма, то
    45       приплюсовываем её к нашей вспомогательной строке, и берём след.
    46       терм.
    47     - Если выражение кончилось, то приплюсовываем текущую строку, и
    48       вызываем нужный create_expr от вспомогательной строки.
    49 Последний шаг. Обработка завершающих пробелов.
    50     - Если встретили пробел, повторяем шаг.
    51     - Если встретили что-то ещё, то $fail.
    52     - Если кончилась строка, берём след. терм.
    53     - Если выражение кончилось, вызываем нужный create_expr от
    54       вспомогательной строки.
    55 
    56 */
    5716
    5817RF_FUNC (To_m_Int, (RF_ARG e_Exp), (RF_RES s_Int))
     
    6019  Term* p = e_Exp.get_last();
    6120
     21  //строка-результат
     22  //
    6223  pxx::WString str;
     24 
     25  //вспомогательная строка, получающаяся из каждого терма
     26  //
    6327  pxx::WString s;
     28
    6429  size_t j = 0;
    6530  size_t k = 0;
     
    7136  bool digit = false;
    7237
     38  //если нашли цифру или знак, то выходим из цикла, чтобы обработать
     39  //эти и следующие символы,
     40  //если знак был '-' и терм был типа Char, добавляем его к строке-результату;
     41  //пробелы, предшествующие всем символам, пропускаем;
     42  //если ничего, кроме пробелов в выражении не встречается, то $fail;
     43  //
    7344  for (; t < p; t++) {
    7445    s = WString(*t);
     
    9869  }
    9970
     71  //начинаем просмотр очередного терма с той позиции, на которой нашли
     72  //цифру или знак;
     73  //ищем первую цифру, не равную 0, если нашли, то выходим из цикла ее
     74  //обрабатывать,
     75  //если выражение состоит только из 0, то выходим из
     76  //функции со значением результата, равным 0,
     77  //пропускаем первый знак '+' или '-', если терм типа Char,
     78  //и не допускаем появления еще каких-либо знаков;
     79  //если встретили не цифру, а что-либо еще, то $fail;
     80  //
    10081  for (; t < p; t++) {
    10182    s = WString(*t);
     
    121102    else k = 0;
    122103  }
    123  
     104
     105  //начинаем просмотр очередного терма с той позиции, на которой нашли
     106  //ненулевую цифру;
     107  //если строка, полученная из терма, закончилась, добавляем ее к результату
     108  //и переходим к следующему терму;
     109  //выходим из цикла, если встретили пробел, добавив к результату
     110  //вспомогательную строку;
     111  //если встретили не цифру, то $fail;
     112  //
    124113  for (; t < p; t++) {
    125114    s = WString(*t);
     
    141130  }
    142131
     132  //начинаем просмотр терма с той позиции, где нашли пробел;
     133  //если встретили что-то еще, то $fail;
     134  //
    143135  for (; t < p; t++) {
    144136    s = WString(*t);
     
    150142    j = 0;
    151143  }   
    152 
     144  //создаем выражение из полученной строки
     145  //если длина его не превышает ShortInt::max_len
     146  //
    153147  if (length < ShortInt::max_len) {
    154148    s_Int = ShortInt::create_expr(str);
Note: See TracChangeset for help on using the changeset viewer.