ВУЗ:
Составители:
Рубрика:
27
5.5. Более мощные варианты функций сканирования
Функции any, many, match, find не слишком удобны, по-
скольку требуют сохранять позицию в строке, а также имя строч-
ной переменной.
Улучшить ситуацию позволяет оператор сканирования стро-
ки ‘?’, используемый в виде s ? e, где s – строка, а e – некоторое
выражение.
Вычисляя выражение e, Icon использует специальные пере-
менные &subject и &pos.
При этом Icon делает следующее:
Устанавливает конкретное
значение s.
Сохраняет предшествующие значения &subject и &pos.
&subject присваивает значение s, а &pos устанавливает на 1.
Вычисляет e.
Восстанавливает сохраненные на шаге 2 значения &subject и
&pos.
Возвращает значение e.
В случае использования оператора ‘?’ наилучший способ
изменения &pos – это использование функций tab(i) и move(j).
Первая присваивает &pos некоторое абсолютное значение i, а вто-
рая «перемещает» позицию на &pos+j. Обе функции возвращают
подстроку между начальной и новой позициями
.
Примеры:
procedure main()
s:="aaabbbccc"
s ? write(tab(4))
end
Выход: aaa
procedure main()
s:="aaabbbccc"
s ? write(move(4))
end
Выход: aaab
procedure main()
s:="aaabbbccc"
28
s ? {writes(tab(4));writes(move(4))}
end
Выход: aaa bbbc
Теперь с использованием оператора сканирования строки
подпрограмма выделения идентификаторов будет выглядеть так
[3, с. 78]:
#generate identifiers in string
procedure idents(s)
local i, j, initIdChars, idChars
initIdChars := &letters++’_’
idChars := initIdChars++&digits
s ? suspend tab(upto(initIdChars)) &
pos(1) | (move(-1),tab(any(~idChars))) &
tab(many(idChars))
end
5.5. Более мощные варианты функций сканирования s ? {writes(tab(4));writes(move(4))}
end
Функции any, many, match, find не слишком удобны, по-
Выход: aaa bbbc
скольку требуют сохранять позицию в строке, а также имя строч-
ной переменной.
Теперь с использованием оператора сканирования строки
Улучшить ситуацию позволяет оператор сканирования стро-
подпрограмма выделения идентификаторов будет выглядеть так
ки ‘?’, используемый в виде s ? e, где s – строка, а e – некоторое
[3, с. 78]:
выражение.
#generate identifiers in string
Вычисляя выражение e, Icon использует специальные пере-
procedure idents(s)
менные &subject и &pos.
local i, j, initIdChars, idChars
При этом Icon делает следующее:
initIdChars := &letters++’_’
Устанавливает конкретное значение s.
idChars := initIdChars++&digits
Сохраняет предшествующие значения &subject и &pos.
s ? suspend tab(upto(initIdChars)) &
&subject присваивает значение s, а &pos устанавливает на 1.
pos(1) | (move(-1),tab(any(~idChars))) &
Вычисляет e.
tab(many(idChars))
Восстанавливает сохраненные на шаге 2 значения &subject и
end
&pos.
Возвращает значение e.
В случае использования оператора ‘?’ наилучший способ
изменения &pos – это использование функций tab(i) и move(j).
Первая присваивает &pos некоторое абсолютное значение i, а вто-
рая «перемещает» позицию на &pos+j. Обе функции возвращают
подстроку между начальной и новой позициями.
Примеры:
procedure main()
s:="aaabbbccc"
s ? write(tab(4))
end
Выход: aaa
procedure main()
s:="aaabbbccc"
s ? write(move(4))
end
Выход: aaab
procedure main()
s:="aaabbbccc"
27 28
Страницы
- « первая
- ‹ предыдущая
- …
- 12
- 13
- 14
- 15
- 16
- …
- следующая ›
- последняя »
