![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 375 Pomógł: 20 Dołączył: 28.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
Wyodrębnienie jednostek leksykalnych z kodu o zajętości 123 KB trwa ponad 20 sekund. Kod jest następujący:
Jak widać, skrypt używa wyrażeń regularnych do wyodrębniania jednostek leksykalnych w natępujący sposób: 1. Wczytaj kod. 2. Dopóki kod nie jest pusty: 2.1. Przejedź po wszystkich zdefiniowanych typach jednostek: 2.1.1. Jeśli jednostka jest na początku kodu, wyodrębnij ją i usuń z kodu. 2.1.2. Jeśli nie dopasowano żadnej jednostki, rzuć wyjątek. Czas zależy od liczby zdefiniowanych typów jednostek i ilości jednostek w analizowanym kodzie. Większość jednostek można znaleźć za pomocą funkcji str_* ale czy uzyskamy duże przyspieszenie w stosunku do wyrażeń regularnych? Pojawi się wtedy inny problem. Kod int INTRO Zakładając kolejność i nierozróżnianie wielkości znaków: Kod TYP : string|int|float|bool NAZWA : [a-zA-Z_$][a-zA-Z0-9_$]* Uzyskamy 3 jednostki - int (typ), INT (typ), RO (nazwa) Na odwrót - int (nazwa), INTRO (nazwa) Oba wyniki są błędne. Na szczęście PCRE wykrywa krawędzie słów za pomocą \b. Bez PCRE trzeba by badać to ręcznie. A może to błędne podejście do budowy analizatora leksykalnego? Jak go należy prawidłowo napisać? Czy potrzebujemy aż tyle jednostek? Może wystarczy tylko kilka: 1) ciąg znaków (wszystko w cudzysłowach) 2) stała / zmienna (tekst bez cudzysłowów) 3) liczba 4) operatory - można rozbić na osobne typy jednostek 5) przecinek, nawiasy - jak wyżej Co do (2) to byłoby już zadanie parsera, aby wykrywał słowa kluczowe. -------------------- „Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 09:12 |