Proyek ini adalah kompiler yang mengambil program sumber yang ditulis dalam C# (input) kemudian menerjemahkannya ke dalam program target yang ditulis dalam Visual Basic (output) . Proses ini dilakukan dengan melalui tiga modul ( Tokenizer
, Parser
, dan Translator
). Setiap modul akan dijelaskan secara terpisah dalam laporan ini.
Tokenizer / Lexical Analyzer adalah program yang mengambil rangkaian karakter (input) dan mengeluarkan rangkaian token (output).
Tokenizer memiliki daftar definisi untuk setiap token yang mungkin dihasilkan dengan mengelompokkan serangkaian karakter. Setiap definisi token terdiri dari:
Tabel berikut mewakili semua definisi yang digunakan dalam proyek, dengan contoh nilai yang cocok untuk masing-masing definisi.
Jenis | Ekspresi Reguler | Nilai yang Cocok |
---|---|---|
Menggunakan | menggunakan | using |
Kelas | kelas | class |
Jika | jika | if |
Kalau tidak | kalau tidak | else |
Untuk | untuk | for |
Melakukan | Mengerjakan | do |
Ketika | ketika | while |
Mengalihkan | mengalihkan | switch |
Kasus | kasus | case |
Merusak | merusak | break |
Bawaan | bawaan | default |
Kembali | kembali | return |
Batal | batal | null |
BENAR | BENAR | true |
PALSU | PALSU | false |
PALSU | (batal | var) | (bool | char | short | int | long | float | double | desimal | string | String) ([] | ?)? | void bool char? int[] |
Jenis | Ekspresi Reguler | Nilai yang Cocok |
---|---|---|
Nomor | d*.d+ | d+ | 77 .25 3.14 |
Rangkaian | "[^"]*" | "This is string" |
Pengidentifikasi | [a-zA-Z_]w* | fact _private iD_1 |
Komentar | (?<=//) .*? (?=(r | n | //)) | // inline comment |
Komentar Multiline | (?<=/*) (?:(?!*/)(?:.|[rn]))* (?=*/) | /*multi line comment */ |
Jenis | Ekspresi Reguler | Nilai yang Cocok |
---|---|---|
Dan | && | & | && & |
Atau | || | | | || | |
Bukan | ! | ! |
Setara | = | = |
Ditambah Sama | += | += |
MinusSama | -= | -= |
GandaEquals | == | == |
Tidak Sama | != | != |
Kurang dari | < | < |
Lebih Besar Dari | > | > |
Kurang Dari Atau Sama | <= | <= |
Lebih Besar Dari Atau Sama | >= | >= |
Jenis | Ekspresi Reguler | Nilai yang Cocok |
---|---|---|
OpenRoundBracket | ( | ( |
TutupRoundBracket | ) | ) |
OpenCurlyBracket | { | { |
TutupCurlyBracket | } | } |
OpenSquareBracket | [ | [ |
TutupSquareBracket | ] | ] |
Plus | + | + |
dikurangi | - | - |
DoublePlus | ++ | ++ |
Minus Ganda | -- | -- |
Persen | % | % |
Asterisk | * | * |
Garis miring terbalik | \ |
|
Tebasan Depan | / | / |
Garis miring ganda ke depan | // | // |
MajuSlashAsterisk | /* | /* |
AsteriskMajuSlash | */ | */ |
Dot | . | . |
Koma | , | , |
Usus besar | : | : |
Titik koma | ; | ; |
Semua jenis token ini dikelompokkan sebagai enum dalam file TokenType.cs.
public enum TokenType
{
// Keywords
Using , // using
Class , // class
If , // if
Else , // else
For , // for
Do , // do
While , // while
Switch , // switch
Case , // case
Break , // break
Default , // default
Return , // return
Null , // null
True , // true
False , // false
DataType , // void | bool | char? | int[]
// Values
Number , // 77 | .25 | 3.14
String , // "I am 'Moaz'"
Comment , // Any Character After (//) and Before (r | n | //)
Identifier , // fact | _private | iD_1
MultilineComment , // Any Character After (/*) and Before (*/)
// Operators
And , // && | &
Or , // || | |
Not , // !
Equal , // =
PlusEqual , // +=
MinusEqual , // -=
DoubleEquals , // ==
NotEqual , // !=
LessThan , // <
GreaterThan , // >
LessThanOrEqual , // <=
GreaterThanOrEqual , // >=
// Symbols
OpenRoundBracket , // (
CloseRoundBracket , // )
OpenCurlyBracket , // {
CloseCurlyBracket , // }
OpenSquareBracket , // [
CloseSquareBracket , // ]
Plus , // +
Minus , // -
DoublePluses , // ++
DoubleMinuses , // --
Percent , // %
Asterisk , // *
BackSlash , //
ForwardSlash , // /
DoubleForwardSlashes , // //
ForwardSlashAsterisk , // /*
AsteriskForwardSlash , // */
Dot , // .
Comma , // ,
Colon , // :
Semicolon // ;
}
dan definisinya dibuat dan disimpan di List<TokenDefinition> dalam file Tokenizer.cs.
private readonly List < TokenDefinition > _tokenDefinitions = new List < TokenDefinition >
{
// Keywords
new TokenDefinition ( TokenType . Using , @"using" ) ,
new TokenDefinition ( TokenType . Class , @"class" ) ,
new TokenDefinition ( TokenType . If , @"if" ) ,
new TokenDefinition ( TokenType . Else , @"else" ) ,
new TokenDefinition ( TokenType . For , @"for" ) ,
new TokenDefinition ( TokenType . Do , @"do" , 1 ) ,
new TokenDefinition ( TokenType . While , @"while" ) ,
new TokenDefinition ( TokenType . Switch , @"switch" ) ,
new TokenDefinition ( TokenType . Case , @"case" ) ,
new TokenDefinition ( TokenType . Default , @"default" ) ,
new TokenDefinition ( TokenType . Break , @"break" ) ,
new TokenDefinition ( TokenType . Return , @"return" ) ,
new TokenDefinition ( TokenType . Null , @"null" ) ,
new TokenDefinition ( TokenType . True , @"true" ) ,
new TokenDefinition ( TokenType . False , @"false" ) ,
new TokenDefinition ( TokenType . DataType , @"(void|var)|(bool|char|short|int|long|float|double|decimal|String|string)([]|?)?" ) ,
// Values
new TokenDefinition ( TokenType . Number , @"d*.d+|d+" ) ,
new TokenDefinition ( TokenType . String , @"""[^""]*""" ) ,
new TokenDefinition ( TokenType . Identifier , @"[a-zA-Z_]w*" , 1 ) ,
new TokenDefinition ( TokenType . Comment , @"(?<=//).*?(?=(r|n|//))" ) ,
new TokenDefinition ( TokenType . MultilineComment , @"(?<=/*)(?:(?!*/)(?:.|[rn]))*(?=*/)" ) ,
// Operators
new TokenDefinition ( TokenType . And , @"&&|&" ) ,
new TokenDefinition ( TokenType . Or , @"||||" ) ,
new TokenDefinition ( TokenType . Not , @"!" , 1 ) ,
new TokenDefinition ( TokenType . Equal , @"=" , 1 ) ,
new TokenDefinition ( TokenType . PlusEqual , @"+=" ) ,
new TokenDefinition ( TokenType . MinusEqual , @"-=" ) ,
new TokenDefinition ( TokenType . DoubleEquals , @"==" ) ,
new TokenDefinition ( TokenType . NotEqual , @"!=" ) ,
new TokenDefinition ( TokenType . LessThan , @"<" , 1 ) ,
new TokenDefinition ( TokenType . GreaterThan , @">" , 1 ) ,
new TokenDefinition ( TokenType . LessThanOrEqual , @"<=" ) ,
new TokenDefinition ( TokenType . GreaterThanOrEqual , @">=" ) ,
// Symbols
new TokenDefinition ( TokenType . OpenRoundBracket , @"(" ) ,
new TokenDefinition ( TokenType . CloseRoundBracket , @")" ) ,
new TokenDefinition ( TokenType . OpenCurlyBracket , @"{" ) ,
new TokenDefinition ( TokenType . CloseCurlyBracket , @"}" ) ,
new TokenDefinition ( TokenType . OpenSquareBracket , @"[" ) ,
new TokenDefinition ( TokenType . CloseSquareBracket , @"]" ) ,
new TokenDefinition ( TokenType . Plus , @"+" , 1 ) ,
new TokenDefinition ( TokenType . Minus , @"-" , 1 ) ,
new TokenDefinition ( TokenType . DoublePluses , @"++" ) ,
new TokenDefinition ( TokenType . DoubleMinuses , @"--" ) ,
new TokenDefinition ( TokenType . Percent , @"%" ) ,
new TokenDefinition ( TokenType . Asterisk , @"*" , 1 ) ,
new TokenDefinition ( TokenType . BackSlash , @"\" ) ,
new TokenDefinition ( TokenType . ForwardSlash , @"/" , 1 ) ,
new TokenDefinition ( TokenType . DoubleForwardSlashes , @"//" ) ,
new TokenDefinition ( TokenType . ForwardSlashAsterisk , @"/*" ) ,
new TokenDefinition ( TokenType . AsteriskForwardSlash , @"*/" ) ,
new TokenDefinition ( TokenType . Dot , @"." ) ,
new TokenDefinition ( TokenType . Comma , @"," ) ,
new TokenDefinition ( TokenType . Colon , @":" ) ,
new TokenDefinition ( TokenType . Semicolon , @";" ) ,
} ;
.. .
Ketika tokenizer menghadapi beberapa urutan karakter seperti ++
menjadi bingung, apakah itu salah satu token bertipe DoublePluses ? Atau dua token berurutan bertipe Plus ? Masalah ini juga berlaku untuk token lain yang tumpang tindih seperti: { +
, +=
} & { -
, --
} & { -
, -=
} & { /
, //
}
Larutan:
Setiap token akan diberi properti Priority dengan nilai default 0 (Highest Priority) , dan ketika dua token tumpang tindih seperti +
dan +=
kami menurunkan prioritas token dengan panjang yang lebih pendek +
menjadi 1 .
Sekarang, tokenizer tidak akan bingung lagi antara +
dan +=
, dan akan mengambil yang memiliki prioritas lebih tinggi +=
.
Ketika tokenizer menghadapi beberapa rangkaian karakter seperti "String + String = String"
maka akan menghasilkan tiga jenis token yaitu:
"String + String = String"
+
=
tapi kita hanya membutuhkan token dengan tipe String !!
Larutan:
Setiap token akan diberi properti Indeks Awal dan Indeks Akhir , sehingga token sebelumnya akan memiliki:
Jenis | Nilai | Mulai Indeks | Indeks Akhir |
---|---|---|---|
Rangkaian | "String + String = String" | 0 | 25 |
Plus | + | 8 | 9 |
Setara | = | 17 | 18 |
dan kami mengabaikan token apa pun yang dimulai dalam rentang token lainnya.
Sekarang, tokenizer hanya akan menghasilkan satu token yang bertipe String dan mengabaikan token yang ada di dalamnya.
Parser / Syntax Analyzer adalah program yang mengambil urutan token - yang dihasilkan dari Tokenizer - dan mengelompokkannya untuk membentuk struktur yang ditentukan oleh produksi tata bahasa bebas konteks (CFG) yang digunakan.
Ringkasan:
CAPITAL_CASE
: Non-Terminalsmall_case
: Terminal|
: Alternatif (Atau)ε
: Kosong PROGRAM --> IMPORTS CLASSES
IMPORTS --> IMPORT_STATEMENT IMPORTS | ε
IMPORT_STATEMENT --> using IDS;
CLASSES --> CLASS_STATEMENT CLASSES | ε
CLASS_STATEMENT --> class id { SUPER_STATEMENTS }
SUPER_STATEMENTS --> SUPER_STATEMENT SUPER_STATEMENTS | ε
SUPER_STATEMENT --> COMMENT_STATEMENT | FUNCTION_STATEMENT | INLINE_STATEMENT ;
COMMENT_STATEMENT --> // comment | /* multiline_comment */
FUNCTION_STATEMENT --> data_type id (DECLARES) { STATEMENTS }
INLINE_STATEMENT --> DECSIGN_STATEMENT | DECLARE_STATEMENT | INC_DEC_STATEMENT | ASSIGN_STATEMENT | CALL_STATEMENT
DECSIGN_STATEMENT --> data_type id = EXPRESSION
DECLARE_STATEMENT --> data_type id
INC_DEC_STATEMENT --> id INC_DEC_OPERATOR
ASSIGN_STATEMENT --> id ASSIGN_OPERATOR EXPRESSION
CALL_STATEMENT --> IDS(EXPRESSIONS)
STATEMENTS --> STATEMENT STATEMENTS | ε
STATEMENT --> SUPER_STATEMENT | STRUCT_STATEMENT
STRUCT_STATEMENT --> IF_STATEMENT | WHILE_STATEMENT | DO_WHILE_STATEMENT | FOR_STATEMENT | BLOCK_STATEMENT | RETURN_STATEMENT | SWITCH_STATEMENT
IF_STATEMENT --> if (CONDITION) STATEMENT ELSE_STATEMENT
ELSE_STATEMENT --> else STATEMENT | ε
WHILE_STATEMENT --> while (CONDITION) STATEMENT
DO_WHILE_STATEMENT --> do STATEMENT while (CONDITION);
FOR_STATEMENT --> for (INLINE_STATEMENT; CONDITION; INLINE_STATEMENT) STATEMENT
BLOCK_STATEMENT --> { STATEMENTS }
RETURN_STATEMENT --> return RETURN_STATEMENT_REST;
RETURN_STATEMENT_REST --> EXPRESSION | ε
SWITCH_STATEMENT --> switch (EXPRESSION) { CASES }
CASES --> CASE CASES | ε
CASE --> CASE_STATEMENT | DEFAULT_STATEMENT
CASE_STATEMENT --> case VALUE: STATEMENT break;
DEFAULT_STATEMENT --> default: STATEMENT break;
CONDITION --> EXPRESSION REL_OPERATOR EXPRESSION | true | false
EXPRESSION --> VALUE | id | ( EXPRESSION )
VALUE --> string | number | true | false | null
IDS --> id MORE_IDS
MORE_IDS --> .IDS | ε
DECLARES --> DECLARE_STATEMENT MORE_DECLARES | ε
MORE_DECLARES --> , DECLARES | ε
EXPRESSIONS --> EXPRESSION MORE_EXPRESSIONS | ε
MORE_EXPRESSIONS --> , EXPRESSIONS | ε
INC_DEC_OPERATOR --> ++ | --
ASSIGN_OPERATOR --> = | += | -=
REL_OPERATOR --> == | != | > | >= | < | <=
Dalam ilmu komputer, bentuk Backus–Naur (BNF atau bentuk normal Backus) adalah notasi yang digunakan untuk mendeskripsikan sintaksis bahasa pemrograman atau bahasa formal lainnya. Ini dikembangkan oleh John Backus dan Peter Naur. BNF dapat digambarkan sebagai notasi metasyntax untuk tata bahasa bebas konteks.
-- Formulir Backus–Naur @ Wikipedia
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh:
direferensikan oleh: