Przejdź do zawartości

Analiza semantyczna

Z Wikipedii, wolnej encyklopedii

Analiza semantyczna w teorii kompilatorów to faza procesu kompilacji, wykonywana po analizie syntaktycznej, a przed generowaniem kodu, w której sprawdzana jest poprawność programu na poziomie znaczenia poszczególnych instrukcji oraz programu jako całości. Analiza semantyczna najczęściej operuje na drzewie składni, do którego dodaje dodatkowe informacje, np. typy wartości.

Cel analizy semantycznej

[edytuj | edytuj kod]

Głównym zadaniem w czasie analizy semantycznej jest sprawdzenie, czy program może być jednoznacznie skompilowany. Pewne konstrukcje, mimo że dopuszczalne przez gramatykę języka, mogą być niepoprawne.

W analizie semantycznej można wyróżnić trzy obszary działania:

  • kontrola typów, czyli sprawdzanie poprawności typów w każdym węźle drzewa składni programu (w tym także sprawdzanie, czy identyfikatory zostały zadeklarowane);
  • kontrola poprawności instrukcji, czyli sprawdzenie, czy instrukcje i wyrażenia mają sens w kontekście, w którym zostały użyte,
  • kontrola nazw, czyli sprawdzenie, czy nazwy jednoznacznie identyfikują funkcje, etykiety i inne konstrukcje języka programowania.

Kontrola typów

[edytuj | edytuj kod]

Kontrola typów ma na celu sprawdzenie poprawności typów w takich konstrukcjach językowych jak:

  • przypisania - typ wartości przypisywanej musi być zgodny z typem elementu do którego przypisujemy,
  • operacje arytmetyczne - wartości, do których używany jest operator arytmetyczny, muszą zgadać się z rodzajem operatora,
  • wywołania funkcji - typy parametrów funkcji przy jej wywołaniu muszą zgadzać się z typami zadeklarowanymi,
  • odwołania do pól rekordu - rekord, do którego się odwołujemy, musi mieć pole o podanej nazwie,
  • wywołania metod obiektu - obiekt musi być instancją klasy, która zawiera wywoływaną metodę.

W czasie kontroli typów sprawdzane też jest czy identyfikatory były zadeklarowane. Do tego celu służy tablica symboli.

Kontrola poprawności instrukcji

[edytuj | edytuj kod]

Przez "poprawność instrukcji" rozumie się wszelką inną poprawność instrukcji poza sprawdzaniem typów i identyfikatorów. Sprawdzanie obejmuje:

Kontrola nazw

[edytuj | edytuj kod]

Kontrola nazw polega na sprawdzeniu, czy nazwy identyfikatorów i etykiet w programie źródłowym są poprawne. Za niepoprawne zwykle uważa się:

  • deklaracje dwóch zmiennych o tej samej nazwie w tym samym zakresie widoczności,
  • deklaracje dwóch funkcji (podprogramów) o tej samej nazwie i tych samych parametrach w tym samym zakresie widoczności,
  • użycie niezadeklarowanej zmiennej,
  • użycie tej samej nazwy w dwóch kontekstach, np. jako nazwa typu rekordu i nazwa zmiennej (choć wiele kompilatorów ma oddzielne przestrzenie nazw i takie użycie jest uważane za poprawne,
  • użycie słowa zastrzeżonego jako identyfikatora,
  • deklaracja dwóch etykiet (np. dla goto lub case) o tej samej nazwie, lub brak deklaracji użytej etykiety.

Część z tych rzeczy, np. podwójne deklaracje, jest sprawdzana w czasie tworzenia tablicy symboli.

Zobacz też

[edytuj | edytuj kod]

Bibliografia

[edytuj | edytuj kod]
  • Aho, Sethi, Ullman, Kompilatory. Reguły, metody i narzędzia, WNT 2002
  • Appel, Palsberg, Modern Compiler Implementation in Java, Second Edition, Cambridge University Press, 2002