Teoretyczne podst inform cz IV


40
Języki skryptowe. Interpretowanie.
Przypomnijmy, że wyrażenia regularne (WR)
postrzegaliśmy jako algebraiczny sposób definiowania
wzorców. Wartością takiego wzorca był zbiór łańcuchów
(pewien język).
Do budowy WR używaliśmy symboli pewnego alfabetu oraz
trzech operatorów: sumy, złączenia i domknięcia.
Przyjęliśmy też następującą domyślną kolejność
wykonywania tych operacji:
domknięcie złączenie sumowanie.
Podstawowe zastosowania WR to, przykładowo:
sprawdzenie poprawności daty,
pobieranie fragmentów tekstów,
zastępowanie jednych fragmentów tekstu innymi.
Mechanizmy oparte na WR są dostępne:
w większości języków skryptowych,
edytorach tekstów,
językach zapytań baz danych (np. SQL),
interpretatorach wierszy poleceń (np. Unix)
Język skryptowy to język interpretowany. Programy napisane
w języku skryptowym nazywane są popularnie skryptami i
przechowywane są zwykle w postaci kodu zródłowego, który
jest na bieżąco interpretowany.
Interpretacje należy rozumieć, jako kolejno po sobie
następujące (odniesione do fragmentów kodu zródłowego):
analizę poprawności fragmentu kodu zródłowego,
przekształcanie (translacja) fragmentu kodu do kodu
maszynowego (lub innej formy pośredniej) i
natychmiastowe ich wykonywanie.
41
Zmusza to do ustawicznego tłumaczenia wykonywanych
fragmentów instrukcji, co wielokrotnie wydłuża czas działania
programu. Zaletą jest natomiast możliwość dokonywania
zmian w programie w trybie konwersacyjnym (na bieżąco).
Języki skryptowe są bowiem często projektowane z myślą o
interakcji z użytkownikiem.
Języki interpretowane pozwalają też na pisanie programów
przenośnych, czyli zgodnych z wieloma systemami
operacyjnymi.
Najbardziej znane języki skryptowe, to: PHP, Perl, Python,
JavaScript i VBScript. Języki skryptowe osadzane też są w
grach komputerowych. Służą wtedy do sterowania
przebiegiem gry: fabułą, dialogami, zachowaniem wirtualnych
postaci.
Metaznaki i metasekwencje. Dopasowywanie wzorców.
Zastosowane praktycznie wyrażenia regularne zawierają
przede wszystkim tak zwane metaznaki i metasekwencje.
Metaznaki i metasekwencje to odpowiednio znaki i
sekwencje znaków reprezentujące takie abstrakcje pojęcia,
jak:
ilość pewnych znaków,
rodzaj znaków,
ich położenie.
Dopasowywanie wzorców polega na odnalezieniu fragmentu
łańcucha znaków, zgodnego z danym WR.
42
Istnieją trzy mechanizmy realizujące dopasowywanie
wzorców:
Mechanizm DAS (deterministycznego automatu
skończeniestanowego). Działa on w ten sposób, że
każdy znak łańcucha wejściowego jest porównywany z
WR a wszystkie odnalezione dopasowania są
zapamiętywane. Jest to bardzo szybki mechanizm,
ponieważ każdy znak łańcucha wejściowego jest
sprawdzany tylko jeden raz. Istnieje jednak jedno
odstępstwo od tej reguły  metasekwencje alternatywy
 |  są zachłanne, co oznacza że gdy do wejściowego
łańcucha znaków można dopasować kilka
alternatywnych wersji WR, zostanie wybrana najdłuższa
z nich. Można to ująć lapidarnie
 najdłuższe, położone najbardziej z lewej strony,
dopasowywanie wygrywa
Tradycyjny mechanizm NAS (niedeterministycznego
automatu skończeniestanowego). Tutaj w węzłach
niedeterministycznych każdy możliwy element WR jest
porównywany z wejściowym łańcuchem znaków a w
pamięci przechowywane są miejsca, w których został
dokonany wybór pomiędzy dostępnymi, alternatywnymi
wersjami wyrażenia. Kiedy nie można dopasować danej
wersji, następuje cofnięcie do ostatniej zapamiętanej
pozycji. Mechanizm zachowuje się więc w sposób
zachłanny.
Jeśli jednak zbyt długo nie udaje się dopasować w ten
sposób wyrażenia, mechanizm wraca do zapamiętanych
wcześniej pozycji i stara się dopasować wyrażenie
działając w sposób mniej zachłanny. Wtedy dłuższy
łańcuch znaków, pasujący do wyrażenia, może zostać
zignorowany, jeśli wcześniej uda się dopasować inną
wersje wyrażenia. W ten sposób podaną dla
43
mechanizmu DAS lapidarną regułę można dla
mechanizmu NAS zapisać następująco:
 wykorzystane zostanie pierwsze po kwantyfikatorze
zachłannym, położone najbardziej z lewej strony,
dopasowywanie
Mechanizm POSIX NAS (Portable Operating System
Interface NAS). Jest to mechanizm bazujący na modelach
systemu UNIX. Definiuje on interfejs aplikacji tak, aby
była ona w pełni przenośna pomiędzy różnymi
systemami operacyjnymi.
Działa on podobnie do tradycyjnego mechanizmu NAS z
jedną różnicą:
 zawsze wybierane jest najdłuższe, położone
najbardziej z lewej strony, dopasowanie
Przykłady reprezentacji metaznaków i klas znaków.
Poniżej przedstawione zostaną przykładowe, najczęściej
spotykane, konstrukcje używane przy tworzeniu wyrażeń
regularnych. Należy jednak pamiętać, że zarówno sposób
zapisu, jak i możliwości ich stosowania, mogą nieco się
różnić w poszczególnych implementacjach (w różnych
językach i systemach).
Klasy znaków to sposób definiowania zbiorów znaków.
Klasa znaków odpowiada jednemu znakowi łańcucha
wejściowego, który należy do zdefiniowanego zbioru
znaków.
44
Sekwencja Znaczenie
reprezentująca
znak
\n Znak nowego wiersza
\ósemkowa Znak reprezentowany przez trzycyfrową
liczbę ósemkową
\c(znak) Znak sterujący o podanej nazwie
Tab. 1. Reprezentacje przykładowych znaków dostępnych w
języku PHP v.4.3
Przykłady:
\012 liczba ósemkowa odpowiadająca w kodzie ASCII
znakowi LF (od nowej linii),
\c(H) odpowiada kombinacji Control-H, czyli znakowi
cofnięcia w kodzie ASCII.
Klasa Znaczenie
Znaków
[& ] Pojedynczy podany znak
[^& ] Brak pojedynczego podanego znaku
[& -& ] Pojedynczy znak mieszczący się w podanym
zakresie
. (kropka) Dowolny znak za wyjątkiem znaku nowego
wiersza
\w Znak mogący tworzyć wyrazy; [a-zA-z0-9]
\W Znak, który nie może tworzyć wyrazów;
[^a-zA-z0-9]
\d Cyfra; [0-9]
\s Biały znak; [\n\r\f\t]
Tab. 2. Podstawowe klasy znaków oraz konstrukcje
przypominające klasy znaków w języku PHP v.4.3
45
Przykłady:
[a-z] odpowiada dowolnej małej literze w kodzie ASCII,
Kotwice i konstrukcje przewidywań.
Punkty zakotwiczenia odpowiadają miejscom w wejściowym
łańcuchu znaków.
Konstrukcje przewidywań pasują odpowiednio do tych
miejsc w tekście, gdzie:
zostałby dopasowany podwzorzec (pozytywne
przewidywanie),
nie zostałby dopasowany podwzorzec (pozytywne
negatywne),
znalazłby się koniec dopasowywanego podwzorca
(pozytywne przewidywanie wsteczne),
nie znalazłby się koniec dopasowywanego podwzorca
(negatywne przewidywanie wsteczne).
Kotwica Znaczenie
^ Pasuje do początku przeszukiwanego łańcucha
znaków
\A Odpowiada początkowi całego tekstu
$ \Z \z Pasują do końca łańcucha znaków (nieco różnią
się znaczeniem)
\G Początek aktualnego wyszukiwania
\b Granica słowa; miejsce między znakiem mogącym
tworzyć wyrazy a znakiem nie mogącym tworzyć
wyrazów
Tab. 3. Podstawowe wzorce punktów zakotwiczenia w
języku PHP v.4.3
46
Konstrukcje Znaczenie
przewidywań
(?=& ) Pozytywne przewidywanie
(?!& ) Negatywne przewidywanie
(?<=& ) Pozytywne przewidywanie wsteczne
(?Tab. 4. Podstawowe konstrukcje przewidywań w języku
PHP v.4.3
Przykład:
Wzorzec pi(?=wo) pasuje do łańcucha pi w słowie piwo, ale
nie w słowie pika.
Komentarze i modyfikatory trybów
Modyfikatory trybów pozwalają na zmianę sposobów, w jaki
mechanizmy WR interpretują wyrażenia regularne.
Modyfika Znaczenie
tor
i Tryb ignorowania wielkości liter
x Tryb ignorowania odstępów; pozwala na
umieszczanie komentarzy w WR
U Zmienia zachłanność kwantyfikatorów;
kwantyfikator * przestaje być zachłannym, nato-
miast zachłannym staje się kwantyfikator *?
A Wymusza, aby wyszukiwanie rozpoczęło się od
początku łańcucha wejściowego
(?tryb) Włącza podany tryb (tzn. i, x, U, A) w dalszej
części wyrażenia
(?-tryb) Wyłącza podany tryb w dalszej części
wyrażenia
(?tryb:& ) Włącza w dalszej części wyrażenia podane za
dwukropkiem tryby
47
(?-tryb:& ) Wyłącza w dalszej części wyrażenia podane za
dwukropkiem tryby
\Q Wszystkie kolejne metaznaki WR mają być
traktowane dosłownie
Tab. 5. Podstawowe modyfikatory trybów w języku
PHP v.4.3
Przykład:
Wzorzec używaj(?i:perła) pasuje do łańcuchów:
używaj perła lub używaj perAA
Modyfi Znaczenie
kator
(?#& ) Podłańcuch będzie traktowany jako komentarz
# W trybie x sprawia, że wszystkie znaki do końca
wiersza będą traktowane jak komentarz
Tab. 6. Komentarze w języku PHP v.4.3
Przykład:
.{80}(?#Długość wynosi 80 znaków)
Grupowanie, przechwytywanie, dopasowywanie
warunkowe i sterowanie.
W tej części zostanie podana składnia pozwalająca na:
grupowanie podwzorców,
przechwytywanie dopasowanych fragmentów
wyrażenia,
warunkowe dopasowywanie fragmentów wyrażenia,
określanie ile razy może pojawić się dany podwzorzec.
48
Sekwencja Znaczenie
(& ) Grupuje podwzorce, przechwytuje pasujące
do nich łańcuchy i zapamiętuje w
metaznakach \1, \2, &
(?:& ) Grupuje podwzorce, ale nie przechwytuje i
nie zapamiętuje pasujących do nich
łańcuchów znaków
(?P& ) Grupuje podwzorzec i zapisuje odpowia-
dający mu łańcuch do grupy
przechwytującej o podanej nazwie
(?>& ) Nie pozwala na powtórne wykorzystanie
tekstu pasującego do podwzorca
& |& Sprawdza alternatywne podwzorce
* Dopasowuje podwzorzec 0 lub więcej razy
+ Dopasowuje podwzorzec 1 lub więcej razy
? Dopasowuje podwzorzec 1 lub 0 razy
{n } Dopasowuje podwzorzec dokładnie n razy
{n, } Dopasowuje podwzorzec co najmniej n
razy
(?(warunek) Dopasowuje jeden z dwóch wzorców w
& |& ) zależności od wartości podanego warunku
(warunek jest liczbą całkowitą określającą
grupę przechwytującą, bądz odwołaniem
wstecznym, lub przewidywaniem)
Tab. 7. Podstawowe sekwencje grupowania, przechwytywa-
nia, sekwencji warunkowych i sterowania w języku
PHP v.4.3
Kwantyfikatory określają, ile razy pewien element łańcucha
może być powtórzony. Standardowe kwantyfikatory starają się
dopasować dany element łańcucha maksymalną liczbę razy.
Element jest powtarzany mniejszą liczbę razy wyłącznie w
49
przypadku, gdy jest to konieczne do dopasowania całości
łańcucha.
Kwantyfikatory zachłanne to: *, +, ?, {liczba, liczba}  dana
konstrukcja jest zazwyczaj wykorzystywana maksymalną
liczbę razy.
Kwantyfikatory leniwe to: *?, +?, ??, {liczba, liczba}? 
konstrukcje są najczęściej wykorzystywane minimalną liczbę
razy.
Kwantyfikatory własnościowe to: *+, ++, ?+, {liczba,
liczba}+ działają podobnie jak kwantyfikatory zachłanne, z tą
różnicą, że  blokują te fragmenty łańcucha wejściowego,
które udało im się dopasować i nie pozwalają na pózniejsze
cofanie się i dzielenie tych fragmentów.
Przykłady:
Wyrażenie \b(\w+)\b\s+\1\b pasuje do powtórzonych słów,
np. hej hej
(?:futro) odpowiada słowu futro, lecz nie powoduje jego
zapamiętania
Temat: (?.*) zapisuje łańcuch znaków podany
po słowie Temat: do grupy, do której można się odwołać
przy użyciu nazwy temat
(?>[ab]*)\w\w będzie pasować do łańcucha znaków aabbcc
lecz nie do aabbaa
\b(ptak|smak)\b pasuje do wyrazu ptak i smak
Wyrażenie (an)+? wykorzystujące kwantyfikatory leniwe
powoduje, że pasuje ono jedynie do fragmentu an słowa
banana
(<)?bom(?(1)>|ba) pasuje do łańcucha i bomba. Jest
to przykład wykorzystania wyrażeń warunkowych
50
Wyrażenie (ab)++ab wykorzystujące kwantyfikatory
własnościowe spowoduje, że nie będzie ono pasować do
słowa abababab.


Wyszukiwarka

Podobne podstrony:
Teoretyczne podst inform cz VI
Teoretyczne podst inform cz V
cz IV Prezentacje
Kulawizna u koni cz IV(1)
piosenki wspólnota miłości ukrzyzowanej śpiewnik cz IV format A5
dr hab K Szkatuła Teoretyczne Podstawy Informatyki
teoretyczne podst wychowania ćw
Opracowanie Cz IV 1 5
Learning Italian Ebook cz IV (po angielsku)
dziady cz iv
WYKŁAD Cz IV
m kawinski cz iv
MattRix Przepowiednia cz IV
Przykładowy egzamin teoretyczny technik informatyk
Podstawy informatyki Cz I

więcej podobnych podstron