Önişlem Yönergeleri

Bir dosya sözcük temelli olarak çözümlendikten sonra, çeşitli türlerde kaynak ön işlemesi gerçekleşir. En önemli olan koşullu derleme, hangi kaynağın yazım bilgisi tarafından işlendiğini belirler; dış kaynak yönergeleri ve bölge yönergeleri olmak üzere diğer iki yönerge türü, kaynak hakkında meta bilgi sağlar ancak derleme üzerinde hiçbir etkisi yoktur.

Koşullu Derleme

Koşullu derleme, mantıksal satır dizilerinin gerçek koda çevrilip çevrilmeyeceğini denetler. Koşullu derlemenin başında tüm mantıksal çizgiler etkinleştirilir; ancak, koşullu derleme deyimlerindeki satırların çevrelenmesi, bu satırları dosya içinde seçmeli olarak devre dışı bırakabilir ve bu da derleme işleminin geri kalanında yok sayılmalarına neden olabilir.

CCStart
    : CCStatement*
    ;

CCStatement
    : CCConstantDeclaration
    | CCIfGroup
    | LogicalLine
    ;

CCExpression
    : LiteralExpression
    | CCParenthesizedExpression
    | CCSimpleNameExpression
    | CCCastExpression
    | CCOperatorExpression
    | CCConditionalExpression
    ;

CCParenthesizedExpression
    : '(' CCExpression ')'
    ;

CCSimpleNameExpression
    : Identifier
    ;

CCCastExpression
    : 'DirectCast' '(' CCExpression ',' TypeName ')'
    | 'TryCast' '(' CCExpression ',' TypeName ')'
    | 'CType' '(' CCExpression ',' TypeName ')'
    | CastTarget '(' CCExpression ')'
    ;

CCOperatorExpression
    : CCUnaryOperator CCExpression
    | CCExpression CCBinaryOperator CCExpression
    ;

CCUnaryOperator
    : '+' | '-' | 'Not'
    ;

CCBinaryOperator
    : '+'     | '-'     | '*'   | '/'       | '\\'     | 'Mod' | '^' | '='
    | '<' '>' | '<'     | '>'   | '<' '='   | '>' '='  | '&'
    | 'And'   | 'Or'    | 'Xor' | 'AndAlso' | 'OrElse'
    | '<' '<' | '>' '>'
    ;

CCConditionalExpression
    : 'If' '(' CCExpression ',' CCExpression ',' CCExpression ')'
    | 'If' '(' CCExpression ',' CCExpression ')'
    ;

Örneğin, program

#Const A = True
#Const B = False

Class C

#If A Then
    Sub F()
    End Sub
#Else
    Sub G()
    End Sub
#End If

#If B Then
    Sub H()
    End Sub
#Else
    Sub I()
    End Sub
#End If

End Class

programla tam olarak aynı belirteç dizisini üretir

Class C
    Sub F()
    End Sub

    Sub I()
    End Sub
End Class

Koşullu derleme yönergelerinde izin verilen sabit ifadeler, genel sabit ifadelerin bir alt kümesidir.

Önişlemci, her belirteç öncesinde ve sonrasında boşluk ve açık satır devamlılıklarına izin verir.

Koşullu Sabit Yönergeleri

Koşullu sabit deyimleri, kaynak dosya kapsamındaki ayrı bir koşullu derleme bildirim alanında bulunan sabitleri tanımlar.

CCConstantDeclaration
    : '#' 'Const' Identifier '=' CCExpression LineTerminator
    ;

Bildirim alanı, koşullu derleme sabitlerinin açık bir şekilde bildirilmesi gerekmemesi açısından özeldir; koşullu sabitler koşullu derleme yönergesinde örtük olarak tanımlanabilir.

Bir değer atanmadan önce, koşullu derleme sabiti değerine Nothingsahiptir. Koşullu derleme sabitine sabit bir ifade olması gereken bir değer atandığında, sabitin türü kendisine atanan değerin türü olur. Koşullu derleme sabiti, kaynak dosya genelinde birden çok kez yeniden tanımlanabilir.

Örneğin, aşağıdaki kod yalnızca dizesini about to print value ve değerini Testyazdırır.

Module M1
    Sub PrintValue(Test As Integer)

#Const DebugCode = True

#If DebugCode Then
        Console.WriteLine("about to print value")
#End If

#Const DebugCode = False

        Console.WriteLine(Test)

#If DebugCode Then
        Console.WriteLine("printed value")
#End If

    End Sub
End Module

Derleme ortamı, koşullu derleme bildirim alanında koşullu sabitleri de tanımlayabilir.

Koşullu Derleme Yönergeleri

Koşullu derleme yönergeleri koşullu derlemeyi denetler.

CCIfGroup
    : '#' 'If' CCExpression 'Then'? LineTerminator CCStatement*
    CCElseIfGroup* CCElseGroup? '#' 'End' 'If' LineTerminator
    ;

CCElseIfGroup
    : '#' ElseIf CCExpression 'Then'? LineTerminator CCStatement*
    ;

CCElseGroup
    : '#' 'Else' LineTerminator CCStatement*
    ;

Koşullu sabitler yalnızca sabit ifadelere ve koşullu derleme sabitlerine başvurabilir. Tek bir koşullu derleme grubu içindeki sabit ifadelerin her biri değerlendirilir ve koşullu ifadelerden biri olarak değerlendirilene kadar metinsel sırayla türüne TruedönüştürülürBoolean. bir ifade olarak Booleandönüştürülemiyorsa, derleme zamanı hatası oluşur. İzinli semantikler ve ikili dize karşılaştırmaları, herhangi bir Option yönerge veya derleme ortamı ayarından bağımsız olarak koşullu derleme sabit ifadeleri değerlendirilirken her zaman kullanılır.

İç içe koşullu derleme yönergeleri de dahil olmak üzere grup tarafından kapsanan tüm satırlar, ifadeyi içeren True deyim ile grubun sonraki koşullu deyimi arasındaki satırlar veya grupta bir Else görünürse deyimiyle End If deyimi arasındaki Else satırlar dışında devre dışı bırakılır ve ifadelerin tümü olarak değerlendirilirFalse.

Bu örnekte, koşullu derleme yönergesindeki çağrısıWriteToLog, çevresindeki Debug koşullu derleme yönergesi olarak değerlendirildiğinden işlenmezFalse.Trace

#Const Debug = False   ' Debugging off
#Const Trace = True    ' Tracing on

Class PurchaseTransaction
    Sub Commit()

#If Debug Then
        CheckConsistency()
#If Trace Then
        WriteToLog(Me.ToString())
#End If
#End If
        ...
    End Sub
End Class

Dış Kaynak Yönergeleri

Kaynak dosya, kaynak satırlar ile kaynağın dışındaki metinler arasında eşlemeyi gösteren dış kaynak yönergeleri içerebilir.

ESDStart
    : ExternalSourceStatement*
    ;

ExternalSourceStatement
    : ExternalSourceGroup
    | LogicalLine
    ;

ExternalSourceGroup
    : '#' 'ExternalSource' '(' StringLiteral ',' IntLiteral ')' LineTerminator
      LogicalLine* '#' 'End' 'ExternalSource' LineTerminator
    ;

Dış kaynak yönergelerinin derleme üzerinde hiçbir etkisi yoktur ve iç içe yerleştirilmeyebilir. Örneğin:

Module Test
    Sub Main()

#ExternalSource("c:\wwwroot\inetpub\test.aspx", 30)
        Console.WriteLine("In test.aspx")
#End ExternalSource

    End Sub
End Module

Bölge Yönergeleri

Bölge yönergeleri kaynak kodun satırlarını gruplandırıyor ancak derleme üzerinde başka bir etkisi yok. Tüm grup tümleşik geliştirme ortamında (IDE) daraltılabilir ve gizlenebilir veya genişletilip görüntülenebilir.

RegionStart
    : RegionStatement*
    ;

RegionStatement
    : RegionGroup
    | LogicalLine
    ;

RegionGroup
    : '#' 'Region' StringLiteral LineTerminator
      RegionStatement*
      '#' 'End' 'Region' LineTerminator
    ;

Bölgeler iç içe yerleştirilmiş olabilir. Bölge yönergeleri, bir yöntem gövdesi içinde başlayamaz veya sonlandıramazlar ve programın blok yapısına saygı duymaları gerekir. Örneğin:

Module Test
#Region "Startup code - do not edit"
    Sub Main()
    End Sub
#End Region

End Module


' Error due to Region directives breaking the block structure
Class C
#Region "Fred"
End Class
#End Region

Dış Sağlama Toplamı Yönergeleri

Kaynak dosya, bir dış kaynak yönergesinde başvuruda bulunılan bir dosya için hangi sağlama toplamının yayılması gerektiğini gösteren bir dış sağlama toplamı yönergesi içerebilir. Diğer tüm açılardan dış kaynak yönergelerinin derleme üzerinde hiçbir etkisi yoktur.

ExternalChecksumStart
    : ExternalChecksumStatement*
    ;

ExternalChecksumStatement
    : '#' 'ExternalChecksum' '('
      StringLiteral ',' StringLiteral ',' StringLiteral
      ')' LineTerminator
    ;

Dış sağlama toplamı yönergesi, dış dosyanın dosya adını, dosyayla ilişkili genel benzersiz tanımlayıcıyı (GUID) ve dosyanın sağlama toplamını içerir. GUID, "{xxxx-xxxx-xxxx-xxxx}" biçiminde bir dize sabiti olarak belirtilir; burada x onaltılık bir basamaktır. Sağlama toplamı, "xxxx..." formunun dize sabiti olarak belirtilir; burada x onaltılık bir basamaktır. Sağlama toplamındaki basamak sayısı çift sayı olmalıdır.

Tüm GUID ve sağlama toplamı değerlerinin tam olarak eşleşmesi koşuluyla, dış dosyayla ilişkilendirilmiş birden çok dış sağlama toplamı yönergesi olabilir. Dış dosyanın adı derlenen bir dosyanın adıyla eşleşiyorsa, sağlama toplamı derleyicinin sağlama toplamı hesaplaması için yoksayılır.

Örneğin:

#ExternalChecksum("c:\wwwroot\inetpub\test.aspx", _
    "{12345678-1234-1234-1234-123456789abc}", _
    "1a2b3c4e5f617239a49b9a9c0391849d34950f923fab9484")

Module Test
    Sub Main()

#ExternalSource("c:\wwwroot\inetpub\test.aspx", 30)
        Console.WriteLine("In test.aspx")
#End ExternalSource

    End Sub
End Module