ВУЗ:
Составители:
Рубрика:
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
- …
- следующая ›
- последняя »