Share via


Arbeta med semantik

Syntaxträd representerar källkodens lexikala och syntaktiska struktur. Även om enbart den här informationen räcker för att beskriva alla deklarationer och logik i källan är det inte tillräckligt med information för att identifiera vad som refereras till. Ett namn kan representera:

  • en typ
  • ett fält
  • en metod
  • en lokal variabel

Även om var och en av dessa är unikt annorlunda, kräver det ofta en djup förståelse av språkreglerna för att avgöra vilken identifierare som faktiskt refererar till.

Det finns programelement som representeras i källkoden, och program kan också referera till tidigare kompilerade bibliotek, paketerade i sammansättningsfiler. Även om ingen källkod, och därför inga syntaxnoder eller träd, är tillgängliga för sammansättningar, kan program fortfarande referera till element i dem.

För dessa uppgifter behöver du semantisk modell.

Förutom en syntaktisk modell av källkoden kapslar en semantisk modell in språkreglerna, vilket ger dig ett enkelt sätt att korrekt matcha identifierare med rätt programelement som refereras.

Sammanställning

En kompilering är en representation av allt som behövs för att kompilera ett C#- eller Visual Basic-program, som innehåller alla sammansättningsreferenser, kompilatoralternativ och källfiler.

Eftersom all den här informationen finns på en plats kan elementen i källkoden beskrivas mer detaljerat. Kompilering representerar varje deklarerad typ, medlem eller variabel som en symbol. Kompilering innehåller en mängd olika metoder som hjälper dig att hitta och relatera de symboler som antingen har deklarerats i källkoden eller importerats som metadata från en sammansättning.

På samma sätt som syntaxträd är kompileringar oföränderliga. När du har skapat en kompilering kan den inte ändras av dig eller någon annan som du kanske delar den med. Du kan dock skapa en ny kompilering från en befintlig kompilering och ange en ändring när du gör det. Du kan till exempel skapa en kompilering som är densamma på alla sätt som en befintlig kompilering, förutom att den kan innehålla ytterligare en källfil eller sammansättningsreferens.

Symboler

En symbol representerar ett distinkt element som deklareras av källkoden eller importeras från en sammansättning som metadata. Varje namnområde, typ, metod, egenskap, fält, händelse, parameter eller lokal variabel representeras av en symbol.

En mängd olika metoder och egenskaper för typen Compilation hjälper dig att hitta symboler. Du kan till exempel hitta en symbol för en deklarerad typ med dess gemensamma metadatanamn. Du kan också komma åt hela symboltabellen som ett träd med symboler som rotas av det globala namnområdet.

Symboler innehåller också ytterligare information som kompilatorn bestämmer från källan eller metadata, till exempel andra refererade symboler. Varje typ av symbol representeras av ett separat gränssnitt som härleds från ISymbol, var och en med sina egna metoder och egenskaper som beskriver den information som kompilatorn har samlat in. Många av dessa egenskaper refererar direkt till andra symboler. Egenskapen anger till exempel IMethodSymbol.ReturnType den faktiska typsymbolen som metoden returnerar.

Symboler visar en gemensam representation av namnrymder, typer och medlemmar, mellan källkod och metadata. Till exempel representeras en metod som deklarerades i källkoden och en metod som importerades från metadata av en IMethodSymbol med samma egenskaper.

Symboler liknar i begreppet CLR-typsystemet som representeras av API:et System.Reflection , men de är rikare eftersom de modellerar mer än bara typer. Namnområden, lokala variabler och etiketter är alla symboler. Dessutom är symboler en representation av språkbegrepp, inte CLR-begrepp. Det finns mycket överlappning, men det finns många meningsfulla distinktioner också. Till exempel är en iteratormetod i C# eller Visual Basic en enda symbol. Men när iteratormetoden översätts till CLR-metadata är det en typ och flera metoder.

Semantisk modell

En semantisk modell representerar all semantisk information för en enda källfil. Du kan använda den för att identifiera följande:

  • Symbolerna som refereras till på en specifik plats i källan.
  • Den resulterande typen av uttryck.
  • All diagnostik, som är fel och varningar.
  • Hur variabler flödar in och ut ur källregioner.
  • Svaren på mer spekulativa frågor.