Tata Bahasa Leksikal

Kompilasi program Visual Basic terlebih dahulu melibatkan penerjemahan aliran mentah karakter Unicode ke dalam serangkaian token leksikal yang diurutkan. Karena bahasa Visual Basic tidak berformat bebas, kumpulan token kemudian dibagi lebih lanjut menjadi serangkaian baris logis. Garis logis mencakup dari awal aliran atau terminator garis hingga terminator baris berikutnya yang tidak didahului oleh kelanjutan baris atau hingga akhir aliran.

Nota. Dengan pengenalan ekspresi literal XML dalam bahasa versi 9.0, Visual Basic tidak lagi memiliki tata bahasa leksikal yang berbeda dalam arti bahwa kode Visual Basic dapat ditokenisasi tanpa memperhatikan konteks sindikasi. Hal ini disebabkan oleh fakta bahwa XML dan Visual Basic memiliki aturan leksikal yang berbeda dan serangkaian aturan leksikal yang digunakan pada waktu tertentu tergantung pada konstruksi sindikat apa yang sedang diproses pada saat itu. Spesifikasi ini mempertahankan bagian tata bahasa leksikal ini sebagai panduan untuk aturan leksikal kode Visual Basic reguler.

LogicalLineStart
    : LogicalLine*
    ;

LogicalLine
    : LogicalLineElement* Comment? LineTerminator
    ;

LogicalLineElement
    : WhiteSpace
    | LineContinuation
    | Token
    ;

Token
    : Identifier
    | Keyword
    | Literal
    | Separator
    | Operator
    ;

Karakter dan Garis

Program Visual Basic terdiri dari karakter dari set karakter Unicode.

Character:
    '<Any Unicode character except a LineTerminator>'
    ;

Terminator Garis

Karakter pemisah baris Unicode memisahkan baris logis.

LineTerminator
    : '<Unicode 0x00D>'
    | '<Unicode 0x00A>'
    | '<CR>'
    | '<LF>'
    | '<Unicode 0x2028>'
    | '<Unicode 0x2029>'
    ;

Kelanjutan Baris

Kelanjutan baris terdiri dari setidaknya satu karakter spasi putih yang segera mendahului satu karakter garis bawah sebagai karakter terakhir (selain spasi kosong) dalam baris teks. Kelanjutan baris memungkinkan garis logis untuk menjangkau lebih dari satu garis fisik. Kelanjutan garis diperlakukan seolah-olah mereka adalah ruang kosong, meskipun tidak.

LineContinuation
    : WhiteSpace '_' WhiteSpace* LineTerminator
    ;

Program berikut menunjukkan beberapa kelanjutan baris:

Module Test
    Sub Print( _
        Param1 As Integer, _
        Param2 As Integer )

        If (Param1 < Param2) Or _
            (Param1 > Param2) Then
            Console.WriteLine("Not equal")
        End If
    End Function
End Module

Beberapa tempat dalam tata bahasa sintetis memungkinkan kelanjutan garis implisit. Ketika terminator garis ditemui

  • setelah koma (,), kurung buka ((), buka kurung kurawal ({), atau buka ekspresi tersemat (<%=)

  • setelah kualifikasi anggota (. atau .@ atau ...), asalkan ada sesuatu yang memenuhi syarat (yaitu tidak menggunakan konteks implisit With )

  • sebelum tanda kurung tutup ()), tutup kurung kurawal (}), atau tutup ekspresi tersemat (%>)

  • setelah kurang dari (<) dalam konteks atribut

  • sebelum yang lebih besar dari (>) dalam konteks atribut

  • setelah lebih besar dari (>) dalam konteks atribut tingkat non-file

  • operator kueri sebelum dan sesudah (Where, , OrderSelect, dll.)

  • setelah operator biner (+, -, /, *, dll.) dalam konteks ekspresi

  • setelah operator penugasan (=, :=, +=, -=, dll.) dalam konteks apa pun.

terminator garis diperlakukan seolah-olah itu adalah kelanjutan baris.

Comma
    : ',' LineTerminator?
    ;

Period
    : '.' LineTerminator?
    ;

OpenParenthesis
    : '(' LineTerminator?
    ;

CloseParenthesis
    : LineTerminator? ')'
    ;

OpenCurlyBrace
    : '{' LineTerminator?
    ;

CloseCurlyBrace
    : LineTerminator? '}'
    ;

Equals
    : '=' LineTerminator?
    ;

ColonEquals
    : ':' '=' LineTerminator?
    ;

Misalnya, contoh sebelumnya juga dapat ditulis sebagai:

Module Test
    Sub Print(
        Param1 As Integer,
        Param2 As Integer)

        If (Param1 < Param2) Or
            (Param1 > Param2) Then
            Console.WriteLine("Not equal")
        End If
    End Function
End Module

Kelanjutan baris implisit hanya akan disimpulkan secara langsung sebelum atau sesudah token yang ditentukan. Mereka tidak akan disimpulkan sebelum atau sesudah kelanjutan baris. Contohnya:

Dim y = 10
' Error: Expression expected for assignment to x
Dim x = _

y

Kelanjutan baris tidak akan disimpulkan dalam konteks kompilasi bersyarat. (Catatan. Pembatasan terakhir ini diperlukan karena teks dalam blok kompilasi bersyarat yang tidak dikompilasi tidak harus valid secara sintetis. Dengan demikian, teks dalam blok mungkin secara tidak sengaja "diambil" oleh pernyataan kompilasi kondisional, terutama karena bahasa diperluas di masa depan.)

Spasi Kosong

Spasi kosong hanya berfungsi untuk memisahkan token dan diabaikan. Garis logis yang hanya berisi spasi kosong diabaikan. (Catatan. Terminator garis tidak dianggap sebagai spasi kosong.)

WhiteSpace
    : '<Unicode class Zs>'
    | '<Unicode Tab 0x0009>'
    ;

Komentar

Komentar dimulai dengan karakter tanda kutip tunggal atau kata kunci REM. Karakter kutipan tunggal adalah karakter tanda kutip tunggal ASCII, karakter tanda kutip tunggal kiri Unicode, atau karakter kutipan tunggal kanan Unicode. Komentar dapat dimulai di mana saja pada baris sumber, dan akhir baris fisik mengakhiri komentar. Pengkompilasi mengabaikan karakter antara awal komentar dan terminator baris. Akibatnya, komentar tidak dapat meluas di beberapa baris dengan menggunakan kelanjutan baris.

Comment
    : CommentMarker Character*
    ;

CommentMarker
    : SingleQuoteCharacter
    | 'REM'
    ;

SingleQuoteCharacter
    : '\''
    | '<Unicode 0x2018>'
    | '<Unicode 0x2019>'
    ;

Pengidentifikasi

Pengidentifikasi adalah nama. Pengidentifikasi Visual Basic sesuai dengan Unicode Standard Annex 15 dengan satu pengecualian: pengidentifikasi dapat dimulai dengan karakter garis bawah (konektor). Jika pengidentifikasi dimulai dengan garis bawah, pengidentifikasi harus berisi setidaknya satu karakter pengidentifikasi lain yang valid untuk memisahkannya dari kelanjutan baris.

Identifier
    : NonEscapedIdentifier TypeCharacter?
    | Keyword TypeCharacter
    | EscapedIdentifier
    ;

NonEscapedIdentifier
    : '<Any IdentifierName but not Keyword>'
    ;

EscapedIdentifier
    : '[' IdentifierName ']'
    ;

IdentifierName
    : IdentifierStart IdentifierCharacter*
    ;

IdentifierStart
    : AlphaCharacter
    | UnderscoreCharacter IdentifierCharacter
    ;

IdentifierCharacter
    : UnderscoreCharacter
    | AlphaCharacter
    | NumericCharacter
    | CombiningCharacter
    | FormattingCharacter
    ;

AlphaCharacter
    : '<Unicode classes Lu,Ll,Lt,Lm,Lo,Nl>'
    ;

NumericCharacter
    : '<Unicode decimal digit class Nd>'
    ;

CombiningCharacter
    : '<Unicode combining character classes Mn, Mc>'
    ;

FormattingCharacter
    : '<Unicode formatting character class Cf>'
    ;

UnderscoreCharacter
    : '<Unicode connection character class Pc>'
    ;

IdentifierOrKeyword
    : Identifier
    | Keyword
    ;

Pengidentifikasi reguler mungkin tidak cocok dengan kata kunci, tetapi pengidentifikasi atau pengidentifikasi yang lolos dengan karakter jenis dapat. Pengidentifikasi yang lolos adalah pengidentifikasi yang dibatasi oleh tanda kurung siku. Pengidentifikasi yang lolos mengikuti aturan yang sama dengan pengidentifikasi reguler kecuali mungkin cocok dengan kata kunci dan mungkin tidak memiliki karakter jenis.

Contoh ini mendefinisikan kelas bernama class dengan metode bersama bernama shared yang mengambil parameter bernama boolean lalu memanggil metode .

Class [class]
    Shared Sub [shared]([boolean] As Boolean)
        If [boolean] Then
            Console.WriteLine("true")
        Else
            Console.WriteLine("false")
        End If
    End Sub
End Class

Module [module]
    Sub Main()
        [class].[shared](True)
    End Sub
End Module

Pengidentifikasi tidak peka huruf besar/kecil, sehingga dua pengidentifikasi dianggap sebagai pengidentifikasi yang sama jika hanya berbeda dalam kasus. (Catatan. Pemetaan kasus satu-ke-satu Unicode Standard digunakan saat membandingkan pengidentifikasi dan pemetaan kasus khusus lokal diabaikan.)

Ketik Karakter

Karakter jenis menunjukkan jenis pengidentifikasi sebelumnya. Karakter jenis tidak dianggap sebagai bagian dari pengidentifikasi.

TypeCharacter
    : IntegerTypeCharacter
    | LongTypeCharacter
    | DecimalTypeCharacter
    | SingleTypeCharacter
    | DoubleTypeCharacter
    | StringTypeCharacter
    ;

IntegerTypeCharacter
    : '%'
    ;

LongTypeCharacter
    : '&'
    ;

DecimalTypeCharacter
    : '@'
    ;

SingleTypeCharacter
    : '!'
    ;

DoubleTypeCharacter
    : '#'
    ;

StringTypeCharacter
    : '$'
    ;

Jika deklarasi menyertakan karakter jenis, karakter jenis harus setuju dengan jenis yang ditentukan dalam deklarasi itu sendiri; jika tidak, terjadi kesalahan waktu kompilasi. Jika deklarasi menghilangkan jenis (misalnya, jika tidak menentukan As klausa), karakter jenis secara implisit diganti sebagai jenis deklarasi.

Tidak ada spasi kosong yang dapat datang antara pengidentifikasi dan karakter jenisnya. Tidak ada karakter jenis untuk Byte, , SByteUShort, Short, UInteger atau ULong, karena kurangnya karakter yang sesuai.

Menambahkan karakter jenis ke pengidentifikasi yang secara konseptual tidak memiliki jenis (misalnya, nama namespace layanan) atau ke pengidentifikasi yang jenisnya tidak setuju dengan jenis karakter jenis menyebabkan kesalahan waktu kompilasi.

Contoh berikut menunjukkan penggunaan karakter jenis:

' The follow line will cause an error: standard modules have no type.
Module Test1#
End Module

Module Test2

    ' This function takes a Long parameter and returns a String.
    Function Func$(Param&)

        ' The following line causes an error because the type character
        ' conflicts with the declared type of Func and Param.
        Func# = CStr(Param@)

        ' The following line is valid.
        Func$ = CStr(Param&)
    End Function
End Module

Karakter ! jenis menyajikan masalah khusus karena dapat digunakan baik sebagai karakter jenis maupun sebagai pemisah dalam bahasa. Untuk menghapus ambiguitas, ! karakter adalah karakter jenis selama karakter yang mengikutinya tidak dapat memulai pengidentifikasi. Jika bisa, maka ! karakternya adalah pemisah, bukan karakter jenis.

Kata Kunci

Kata kunci adalah kata yang memiliki arti khusus dalam konstruksi bahasa. Semua kata kunci dicadangkan oleh bahasa dan mungkin tidak digunakan sebagai pengidentifikasi kecuali pengidentifikasi lolos. (Catatan.EndIf, GoSub, Let, Variant, dan Wend dipertahankan sebagai kata kunci, meskipun tidak lagi digunakan dalam Visual Basic.)

Keyword
    : 'AddHandler'      | 'AddressOf'      | 'Alias'       | 'And'
    | 'AndAlso'         | 'As'             | 'Boolean'     | 'ByRef'
	| 'Byte'            | 'ByVal'          | 'Call'        | 'Case'        
	| 'Catch'           | 'CBool'          | 'CByte'       | 'CChar'       
	| 'CDate'           | 'CDbl'           | 'CDec'        | 'Char'        
	| 'CInt'            | 'Class'          | 'CLng'        | 'CObj'        
	| 'Const'           | 'Continue'       | 'CSByte'      | 'CShort'      
	| 'CSng'            | 'CStr'           | 'CType'       | 'CUInt'       
	| 'CULng'           | 'CUShort'        | 'Date'        | 'Decimal'     
	| 'Declare'         | 'Default'        | 'Delegate'    | 'Dim'         
	| 'DirectCast'      | 'Do'             | 'Double'      | 'Each'        
	| 'Else'            | 'ElseIf'         | 'End'         | 'EndIf'       
	| 'Enum'            | 'Erase'          | 'Error'       | 'Event'       
	| 'Exit'            | 'False'          | 'Finally'     | 'For'         
	| 'Friend'          | 'Function'       | 'Get'         | 'GetType'     
	| 'GetXmlNamespace' | 'Global'         | 'GoSub'       | 'GoTo'        
	| 'Handles'         | 'If'             | 'Implements'  | 'Imports'     
	| 'In'              | 'Inherits'       | 'Integer'     | 'Interface'   
	| 'Is'              | 'IsNot'          | 'Let'         | 'Lib'         
	| 'Like'            | 'Long'           | 'Loop'        | 'Me'          
	| 'Mod'             | 'Module'         | 'MustInherit' | 'MustOverride'
	| 'MyBase'          | 'MyClass'        | 'Namespace'   | 'Narrowing'   
	| 'New'             | 'Next'           | 'Not'         | 'Nothing'     
	| 'NotInheritable'  | 'NotOverridable' | 'Object'      | 'Of'          
	| 'On'              | 'Operator'       | 'Option'      | 'Optional'    
	| 'Or'              | 'OrElse'         | 'Overloads'   | 'Overridable' 
	| 'Overrides'       | 'ParamArray'     | 'Partial'     | 'Private'     
	| 'Property'        | 'Protected'      | 'Public'      | 'RaiseEvent'  
	| 'ReadOnly'        | 'ReDim'          | 'REM'         | 'RemoveHandler'
	| 'Resume'          | 'Return'         | 'SByte'       | 'Select'      
	| 'Set'             | 'Shadows'        | 'Shared'      | 'Short'       
	| 'Single'          | 'Static'         | 'Step'        | 'Stop'        
	| 'String'          | 'Structure'      | 'Sub'         | 'SyncLock'    
	| 'Then'            | 'Throw'          | 'To'          | 'True'        
	| 'Try'             | 'TryCast'        | 'TypeOf'      | 'UInteger'    
	| 'ULong'           | 'UShort'         | 'Using'       | 'Variant'     
	| 'Wend'            | 'When'           | 'While'       | 'Widening'    
	| 'With'            | 'WithEvents'     | 'WriteOnly'   | 'Xor'         
    ;

Literasi

Literal adalah representasi tekstual dari nilai tertentu dari jenis. Jenis literal termasuk Boolean, bilangan bulat, titik mengambang, string, karakter, dan tanggal.

Literal
    : BooleanLiteral
    | IntegerLiteral
    | FloatingPointLiteral
    | StringLiteral
    | CharacterLiteral
    | DateLiteral
    | Nothing
    ;

Literal Boolean

True dan False merupakan harfiah dari Boolean jenis yang memetakan ke status benar dan salah, masing-masing.

BooleanLiteral
    : 'True' | 'False'
    ;

Literal Bilangan Bulat

Literal bilangan bulat bisa desimal (dasar 10), heksadesimal (dasar 16), atau oktal (dasar 8). Bilangan bulat desimal literal adalah string digit desimal (0-9). Harfiah &H heksadesimal diikuti oleh string digit heksadesimal (0-9, A-F). Literal &O oktal diikuti oleh string digit oktal (0-7). Literal desimal secara langsung mewakili nilai desimal literal integral, sedangkan literal oktal dan heksadesimal mewakili nilai biner bilangan bulat literal (dengan demikian, &H8000S adalah -32768, bukan kesalahan luapan).

IntegerLiteral
    : IntegralLiteralValue IntegralTypeCharacter?
    ;

IntegralLiteralValue
    : IntLiteral
    | HexLiteral
    | OctalLiteral
    ;

IntegralTypeCharacter
    : ShortCharacter
    | UnsignedShortCharacter
    | IntegerCharacter
    | UnsignedIntegerCharacter
    | LongCharacter
    | UnsignedLongCharacter
    | IntegerTypeCharacter
    | LongTypeCharacter
    ;

ShortCharacter
    : 'S'
    ;

UnsignedShortCharacter
    : 'US'
    ;

IntegerCharacter
    : 'I'
    ;

UnsignedIntegerCharacter
    : 'UI'
    ;

LongCharacter
    : 'L'
    ;

UnsignedLongCharacter
    : 'UL'
    ;

IntLiteral
    : Digit+
    ;

HexLiteral
    : '&' 'H' HexDigit+
    ;

OctalLiteral
    : '&' 'O' OctalDigit+
    ;

Digit
    : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
    ;

HexDigit
    : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
    | 'A' | 'B' | 'C' | 'D' | 'E' | 'F'
    ;

OctalDigit
    : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7'
    ;

Jenis harfiah ditentukan oleh nilainya atau oleh karakter jenis berikut. Jika tidak ada karakter jenis yang ditentukan, nilai dalam rentang jenis di Integer ketik sebagai Integer; nilai di luar rentang untuk Integer di ketik sebagai Long. Jika jenis literal bilangan bulat berukuran tidak mencukupi untuk menahan bilangan bulat secara harfiah, hasil kesalahan waktu kompilasi. (Catatan. Tidak ada karakter jenis karena Byte karakter yang paling alami adalah B, yang merupakan karakter hukum dalam literal heksadesimal.)

Floating-Point Literal

Harfiah titik mengambang adalah bilangan bulat harfiah diikuti oleh titik desimal opsional (karakter periode ASCII) dan mantissa, dan basis opsional 10 eksponen. Secara default, literal floating-point berjenis Double. SingleJika karakter , Double, atau Decimal jenis ditentukan, literalnya adalah jenis tersebut. Jika jenis harfiah floating-point berukuran tidak mencukupi untuk menahan literal floating-point, hasil kesalahan waktu kompilasi.

Nota. Perlu dicatat bahwa Decimal jenis data dapat mengodekan nol berikutnya dalam sebuah nilai. Spesifikasi saat ini tidak memberikan komentar tentang apakah nol berikutnya dalam Decimal harfiah harus dihormati oleh kompilator.

FloatingPointLiteral
    : FloatingPointLiteralValue FloatingPointTypeCharacter?
    | IntLiteral FloatingPointTypeCharacter
    ;

FloatingPointTypeCharacter
    : SingleCharacter
    | DoubleCharacter
    | DecimalCharacter
    | SingleTypeCharacter
    | DoubleTypeCharacter
    | DecimalTypeCharacter
    ;

SingleCharacter
    : 'F'
    ;

DoubleCharacter
    : 'R'
    ;

DecimalCharacter
    : 'D'
    ;

FloatingPointLiteralValue
    : IntLiteral '.' IntLiteral Exponent?
    | '.' IntLiteral Exponent?
    | IntLiteral Exponent
    ;

Exponent
    : 'E' Sign? IntLiteral
    ;

Sign
    : '+'
    | '-'
    ;

String Literals

String literal adalah urutan karakter Unicode nol atau lebih yang dimulai dan diakhir dengan karakter kutipan ganda ASCII, karakter tanda kutip ganda kiri Unicode, atau karakter kutipan ganda kanan Unicode. Dalam string, urutan dua karakter kutipan ganda adalah urutan escape yang mewakili kutipan ganda dalam string.

StringLiteral
    : DoubleQuoteCharacter StringCharacter* DoubleQuoteCharacter
    ;

DoubleQuoteCharacter
    : '"'
    | '<unicode left double-quote 0x201c>'
    | '<unicode right double-quote 0x201D>'
    ;

StringCharacter
    : '<Any character except DoubleQuoteCharacter>'
    | DoubleQuoteCharacter DoubleQuoteCharacter
    ;

Konstanta string berjenis String .

Module Test
    Sub Main()

        ' This prints out: ".
        Console.WriteLine("""")

        ' This prints out: a"b.
        Console.WriteLine("a""b")

        ' This causes a compile error due to mismatched double-quotes.
        Console.WriteLine("a"b")
    End Sub
End Module

Pengkompilasi diizinkan untuk mengganti ekspresi string konstan dengan string literal. Setiap string literal tidak selalu menghasilkan instans string baru. Ketika dua literal string atau lebih yang setara sesuai dengan operator kesetaraan string menggunakan semantik perbandingan biner muncul dalam program yang sama, literal string ini dapat merujuk ke instans string yang sama. Misalnya, output program berikut dapat kembali True karena dua literal dapat merujuk ke instans string yang sama.

Module Test
    Sub Main()
        Dim a As Object = "he" & "llo"
        Dim b As Object = "hello"
        Console.WriteLine(a Is b)
    End Sub
End Module

Literal Karakter

Karakter harfiah mewakili satu karakter Unicode dari jenis tersebut Char . Dua karakter kutipan ganda adalah urutan escape yang mewakili karakter tanda kutip ganda.

CharacterLiteral
    : DoubleQuoteCharacter StringCharacter DoubleQuoteCharacter 'C'
    ;
Module Test
    Sub Main()

        ' This prints out: a.
        Console.WriteLine("a"c)

        ' This prints out: ".
        Console.WriteLine(""""c)
    End Sub
End Module

Literal Tanggal

Tanggal harfiah mewakili momen tertentu dalam waktu yang dinyatakan sebagai nilai jenis Date .

DateLiteral
    : '#' WhiteSpace* DateOrTime WhiteSpace* '#'
    ;

DateOrTime
    : DateValue WhiteSpace+ TimeValue
    | DateValue
    | TimeValue
    ;

DateValue
    : MonthValue '/' DayValue '/' YearValue
    | MonthValue '-' DayValue '-' YearValue
    ;

TimeValue
    : HourValue ':' MinuteValue ( ':' SecondValue )? WhiteSpace* AMPM?
    | HourValue WhiteSpace* AMPM
    ;

MonthValue
    : IntLiteral
    ;

DayValue
    : IntLiteral
    ;

YearValue
    : IntLiteral
    ;

HourValue
    : IntLiteral
    ;

MinuteValue
    : IntLiteral
    ;

SecondValue
    : IntLiteral
    ;

AMPM
    : 'AM' | 'PM'
    ;    

Harfiah dapat menentukan tanggal dan waktu, hanya tanggal, atau hanya waktu. Jika nilai tanggal dihilangkan, maka 1 Januari dari tahun 1 di kalender Gregorian diasumsikan. Jika nilai waktu dihilangkan, maka 12:00:00 diasumsikan.

Untuk menghindari masalah dengan menginterpretasikan nilai tahun dalam nilai tanggal, nilai tahun tidak boleh dua digit. Saat mengekspresikan tanggal di abad pertama AD/CE, nol di depan harus ditentukan.

Nilai waktu dapat ditentukan baik menggunakan nilai 24 jam atau nilai 12 jam; nilai waktu yang menghilangkan AM atau PM diasumsikan sebagai nilai 24 jam. Jika nilai waktu menghilangkan menit, literal 0 digunakan secara default. Jika nilai waktu menghilangkan detik, literal 0 digunakan secara default. Jika menit dan detik dihilangkan, maka AM atau PM harus ditentukan. Jika nilai tanggal yang ditentukan berada di luar rentang Date jenis, kesalahan waktu kompilasi terjadi.

Contoh berikut berisi beberapa literal tanggal.

Dim d As Date

d = # 8/23/1970 3:45:39AM #
d = # 8/23/1970 #              ' Date value: 8/23/1970 12:00:00AM.
d = # 3:45:39AM #              ' Date value: 1/1/1 3:45:39AM.
d = # 3:45:39 #                ' Date value: 1/1/1 3:45:39AM.
d = # 13:45:39 #               ' Date value: 1/1/1 1:45:39PM.
d = # 1AM #                    ' Date value: 1/1/1 1:00:00AM.
d = # 13:45:39PM #             ' This date value is not valid.

Tidak ada

Nothing adalah harfiah khusus; ini tidak memiliki jenis dan dapat dikonversi ke semua jenis dalam sistem jenis, termasuk parameter jenis. Ketika dikonversi ke jenis tertentu, itu setara dengan nilai default dari jenis tersebut.

Nothing
    : 'Nothing'
    ;

Pemisah

Karakter ASCII berikut adalah pemisah:

Separator
    : '(' | ')' | '{' | '}' | '!' | '#' | ',' | '.' | ':' | '?'
    ;

Karakter Operator

Karakter ASCII atau urutan karakter berikut menunjukkan operator:

Operator
    : '&' | '*' | '+' | '-' | '/' | '\\' | '^' | '<' | '=' | '>'
    ;