Udostępnij za pośrednictwem


Korzystanie z semantyki

Drzewa składni reprezentują leksykatyczną i składniową strukturę kodu źródłowego. Chociaż te informacje są wystarczające do opisania wszystkich deklaracji i logiki w źródle, nie wystarczy informacji, aby zidentyfikować, do czego się odwołujesz. Nazwa może reprezentować:

  • typ
  • pole
  • metoda
  • zmienna lokalna

Chociaż każdy z nich jest unikatowo inny, określenie, który identyfikator rzeczywiście odwołuje się do często wymaga głębokiego zrozumienia reguł języka.

Istnieją elementy programu reprezentowane w kodzie źródłowym, a programy mogą również odwoływać się do wcześniej skompilowanych bibliotek, spakowanych w plikach zestawów. Chociaż nie ma kodu źródłowego i dlatego nie ma węzłów składniowych ani drzew, są dostępne dla zestawów, programy nadal mogą odwoływać się do elementów wewnątrz nich.

W przypadku tych zadań potrzebny jest model semantyczny.

Oprócz modelu składniowego kodu źródłowego semantyczny model hermetyzuje reguły języka, zapewniając łatwy sposób poprawnego dopasowania identyfikatorów przy użyciu odpowiedniego elementu programu, do którego odwołuje się odwołanie.

Kompilacja

Kompilacja to reprezentacja wszystkich elementów potrzebnych do skompilowania programu w języku C# lub Visual Basic, który obejmuje wszystkie odwołania do zestawów, opcje kompilatora i pliki źródłowe.

Ponieważ wszystkie te informacje znajdują się w jednym miejscu, elementy zawarte w kodzie źródłowym można opisać bardziej szczegółowo. Kompilacja reprezentuje każdy zadeklarowany typ, składową lub zmienną jako symbol. Kompilacja zawiera różne metody, które ułatwiają znajdowanie i powiązanie symboli, które zostały zadeklarowane w kodzie źródłowym lub zaimportowane jako metadane z zestawu.

Podobnie jak drzewa składni, kompilacje są niezmienne. Po utworzeniu kompilacji nie można go zmienić przez Ciebie ani inną osobę, której możesz udostępnić. Można jednak utworzyć nową kompilację z istniejącej kompilacji, określając zmianę w takiej postaci. Możesz na przykład utworzyć kompilację, która jest taka sama w każdym przypadku jak istniejąca kompilacja, z wyjątkiem dodatkowego pliku źródłowego lub odwołania do zestawu.

Symbole

Symbol reprezentuje odrębny element zadeklarowany przez kod źródłowy lub zaimportowany z zestawu jako metadane. Każda przestrzeń nazw, typ, metoda, właściwość, pole, zdarzenie, parametr lub zmienna lokalna jest reprezentowana przez symbol.

Różne metody i właściwości typu Compilation ułatwiają znajdowanie symboli. Na przykład można znaleźć symbol zadeklarowanego typu według jego nazwy wspólnych metadanych. Możesz również uzyskać dostęp do całej tabeli symboli jako drzewa symboli zakorzenionych w globalnej przestrzeni nazw.

Symbole zawierają również dodatkowe informacje, które kompilator określa ze źródła lub metadanych, takie jak inne przywoływane symbole. Każdy rodzaj symbolu jest reprezentowany przez oddzielny interfejs pochodzący z ISymbolklasy , z których każdy ma własne metody i właściwości zawierające szczegółowe informacje zebrane przez kompilator. Wiele z tych właściwości bezpośrednio odwołuje się do innych symboli. Na przykład IMethodSymbol.ReturnType właściwość informuje o rzeczywistym symbolu typu zwracanej przez metodę.

Symbole przedstawiają wspólną reprezentację przestrzeni nazw, typów i elementów członkowskich między kodem źródłowym a metadanymi. Na przykład metoda zadeklarowana w kodzie źródłowym i metoda zaimportowana z metadanych jest reprezentowana przez obiekt IMethodSymbol o tych samych właściwościach.

Symbole są podobne do systemu typów CLR reprezentowanego przez System.Reflection interfejs API, ale są one bogatsze w to, że modelują więcej niż tylko typy. Przestrzenie nazw, zmienne lokalne i etykiety to wszystkie symbole. Ponadto symbole są reprezentacją pojęć językowych, a nie koncepcji CLR. Istnieje wiele nakładających się na siebie, ale istnieje również wiele znaczących różnic. Na przykład metoda iteratora w języku C# lub Visual Basic jest pojedynczym symbolem. Jednak gdy metoda iteratora jest tłumaczona na metadane CLR, jest to typ i wiele metod.

Model semantyczny

Semantyczny model reprezentuje wszystkie informacje semantyczne dla pojedynczego pliku źródłowego. Możesz go użyć, aby odnaleźć następujące elementy:

  • Symbole, do których odwołuje się określona lokalizacja w źródle.
  • Wynikowy typ dowolnego wyrażenia.
  • Wszystkie dane diagnostyczne, które są błędami i ostrzeżeniami.
  • Sposób przepływu zmiennych w regionach źródła i poza nimi.
  • Odpowiedzi na bardziej spekulacyjne pytania.