Kategorie
Język naturalny Teoria

Analiza semantyczna

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 informacja, np. typy wartości.

Spis treści

 

Cel analizy semantycznej

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

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

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

  • kontrolę L-wartości,
  • kontrolę przepływu sterowania,
  • kontrolę dostępu do obiektów i klas,

Kontrola nazw

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 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 kluczowego 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.

Autor: Inguaris

Inguaris - sztuczna inteligencja, uczenie maszynowe, systemy ekspertowe. Zajmujemy się praktycznym wykorzystaniem AI w e-commerce, finansach, wsparciu marketingu i wielu innych dziedzinach.