КС-грамматика для С# (139 правил, 78 ключевых слов)

Сокращения: опр. - определение, конст. - константный, локал. - локальный, мульпл. - мультипликативный, аддитив. - аддитивный, мод. - модификатор, вставл. - вставляемый, искл. - исключающий, вкл. - включающий
Пространства имен(5)
единица_компиляции= {using-директива} {опр.имени}
using-директива= using идентификатор = имя типа или пространства имен ; | using пространство имен ;
опр.имени= опр.пространства имен | опр.типа
опр.пространства имен= namespace{идентификатор .} идентификатор {{using-директива} {опр.имени} } [;]
опр.типа= опр.класса | опр.структуры | опр.интерфейса | опр.перечисления | опр.делегата
Классы(9)
опр.класса= [атрибуты] {мод.класса} class идентификатор [база класса] { {опр.члена класса} } [;]
мод.класса= new | public | protected | internal | private | abstract | sealed
база класса= : тип класса |
: список типов интерфейсов |
: тип класса , список типов интерфейсов
список типов интерфейсов= тип интерфейса { , тип интерфейса}
опр.члена класса= опр.константы |
опр.поля |
опр.метода |
опр.свойства |
опр.события |
опр.индексатора |
опр.операции |
опр.конструктора |
опр.деструктора |
опр.статического конструктора |
опр.типа
опр.константы= [атрибуты] {мод.константы} const тип определитель константы {, определитель константы} ;
мод.константы= new | public | protected | internal | private
опр.поля= [атрибуты] {мод.поля} тип определитель переменной {, определитель переменной} ;
мод.поля= new | public | protected | internal | private | static | readonly

Методы (37)
опр.метода= [атрибуты] {мод.метода} тип возврата имя члена ( [список формальных параметров] ) тело метода
мод.метода= new | public | protected | internal | private | static | virtual | override | abstract | extern
тип возврата= тип | void
имя члена= [тип интерфейса .] идентификатор
тело метода= блок | ;
список формальных параметров= фикс.параметры | параметр-массив | фикс.параметры , параметр-массив
фикс.параметры= фикс.параметр {, фикс.параметр}
фикс.параметр= [атрибуты] [мод.параметра] тип идентификатор
мод.параметра= ref | out
параметр-массив= [атрибуты] params тип массива идентификатор
опр.свойства= [атрибуты] {мод.свойства} тип имя члена { определения аксессоров }
определения аксессоров= [опр.get-аксессора]+[опр.set-аксессора]
мод.свойства= new | public | protected | internal | private | static | virtual | override | abstract
опр.get-аксессора= [атрибуты] get тело аксессора
опр.set-аксессора= [атрибуты] set тело аксессора
тело аксессора= блок | ;
опр.события= [атрибуты] {мод.события} event тип поле или свойство
мод.события= new | public | protected | internal | private | static
поле или свойство= определитель переменной {, определитель переменной} ; | имя члена { определения аксессоров }
опр.индексатора= [атрибуты] {мод.индексатора} тип [тип интерфейса .] this [ список формальных параметров ] { определения аксессоров }
мод.индексатора= new | public | protected | internal | private | virtual | override | abstract
опр.операции= [атрибуты] мод.операции определитель операции блок
мод.операции= public static | static public
определитель операции= определитель унарной операции | определитель бинарной операции | определитель операции приведения
определитель унарной операции= тип operator переопр.унарн.операция ( тип идентификатор )
переопр.унарн.операция= + | - | ! | ~ | ++ | -- | true | false
определитель бинарной операции= тип operator переопр.бинарн.операция ( тип идентификатор , тип идентификатор )
переопр.бинарн.операция= + | - | * | / | % | & | | | ^ | << | >> | == | != | > | < | >= | <=
определитель операции приведения= [implicit | explicit]+ operator тип ( тип идентификатор )
опр.конструктора= [атрибуты] {мод.конструктора} определитель конструктора блок
мод.конструктора= public | protected | internal | private
определитель конструктора= идентификатор ( [список формальных параметров] ) [конструктор-инициализатор]
конструктор-инициализатор= : [base | this] ( [список аргументов] )
опр.деструктора= [атрибуты] ~ идентификатор ( ) блок
опр.статического конструктора= [атрибуты] static идентификатор ( ) блок
опр.структуры= [атрибуты] {мод.структуры} struct идентификатор [: список типов интерфейсов] { {опр.члена класса} } [;]
мод.структуры= new | public | protected | internal | private

Интерфейсы (8)
опр.интерфейса= [атрибуты] {мод.интерфйса}interface идентификатор [: список типов интерфейсов] [{ {опр.члена интерфейса} } ; ]
мод.интерфйса= new | public | protected | internal | private
опр.члена интерфейса= опр.метода интерфейса | опр.свойства интерфейса | опр.события интерфейса | опр.свойства интерфейса
опр.метода интерфейса= [атрибуты] [new] тип возврата идентификатор ( [список формальных параметров] ) ;
опр.свойства интерфейса= [атрибуты] [new] тип идентификатор { аксессоры интерфейса }
аксессоры интерфейса= [ [атрибуты] get ; ]+[ [атрибуты] set ; ]
опр.события интерфейса= [атрибуты] [new] event тип идентификатор ;
опр.свойства интерфейса= [атрибуты] [new] тип this [ список формальных параметров ] { аксессоры интерфейса }

Типы перечислений (5)
опр.перечисления= [атрибуты] {мод.перечисления}enum идентификатор [: несимвольный тип] тело перечисления [;]
мод.перечисления= new | public | protected | internal | private
несимвольный тип= sbyte | byte | short | ushort | int | uint | long | ulong
тело перечисления= { [опр.элемента {, опр.элемента}] }
опр.элемента= [атрибуты] идентификатор [= конст.выражение]

Делегаты (2)
опр.делегата= [атрибуты] [мод.делегата {, мод.делегата}] delegate тип идентификатор ( [список формальных параметров] ) ;
мод.делегата= new | public | protected | internal | private

Атрибуты (6)
атрибуты= [атрибут {, атрибут}]
атрибут= имя типа ( [позиционный список аргументов]+[именованный список аргументов]+[позиционный список аргументов , именованный список аргументов] )
позиционный список аргументов= позиционный аргумент {, позиционный аргумент}
позиционный аргумент= выражение
именованный список аргументов= именованный аргумент {, именованный аргумент}
именованный аргумент= идентификатор = выражение

Типы (14)
тип= тип-значение | тип-ссылка
тип-значение= имя типа | общий тип | float | double | decimal | bool
общий тип= sbyte | byte | short | ushort | int | uint | long | ulong | char
тип-ссылка= тип класса | тип интерфейса | тип массива | тип делегата
тип класса= имя типа | object | string
тип интерфейса= имя типа
тип массива= не тип массива {[ {,} ]}+
не тип массива= тип
тип делегата= имя типа
переменная-ссылка= выражение
имя типа или пространства имен= идентификатор {. идентификатор}
имя пространства имен= имя типа или пространства имен
имя типа= имя типа или пространства имен
идентификатор= letter { character } | @keyword

Выражения (30)
список аргументов= аргумент {, аргумент}
аргумент= выражение |
[ref | out] переменная-ссылка
первичное выражение= literal |
идентификатор | ( выражение ) |
первичное выражение . идентификатор |
предопределеный тип . идентификатор |
выражение-вызов |
первичное выражение [ выражение {, выражение} ] |
this |
base . идентификатор |
base [ выражение {, выражение} ] |
первичное выражение [++ | --]+ |
new-выражение |
typeof ( тип ) |
sizeof ( тип ) |
checked ( выражение ) |
unchecked ( выражение )
предопределеный тип= bool | byte | char | decimal | double | float | int | long | object | sbyte | short | string | uint | ulong | ushort
выражение-вызов= первичное выражение ( [список аргументов] )
new-выражение= выражение создания объекта | выражение создания массива | new тип делегата ( выражение )
выражение создания объекта= new тип ( [список аргументов] )
выражение создания массива= new не тип массива [ выражение {, выражение} ] {[ {,} ]} [инициализатор массива] |
new тип массива инициализатор массива
инициализатор массива= { {инициализатор переменной ,} [инициализатор переменной]] }
унарное выражение= { + | -! | ~ | * | & | ++ | -- | ( тип ) } первичное выражение  
мультипл.выражение= унарное выражениемультипл.операция унарное выражение }
мультипл.операция= * | / | %
аддитив.выражение= мультипл.выражение {аддитив.операция мультипл.выражение}
аддитив.операция= + | -
shift-выражение= аддитив.выражение {shift-операция аддитив.выражение}
shift-операция= << | >>
выражение отношения= shift-выражение {операция отношения shift-выражение} [ is тип-ссылка]
операция отношения= < | > | <= | >=
равенство-выражение= выражение отношения {операция сравнения выражение отношения}
операция сравнения= == | !=
and-выражение= равенство-выражение { & равенство-выражение}
искл.-или-выражение= and-выражение { ^ and-выражение}
вкл.-или-выражение= искл.-или-выражение { | искл.-или-выражение}
условн.и-выражение= вкл.-или-выражение { && вкл.-или-выражение}
условн.или-выражение= условн.и-выражение { || условн.и-выражение}
присваивание= unary-expression операция присваивания выражение
операция присваивания= = | += | -= | *= | /= | %= | &= | |= | ^= | <<= | >>=
выражение= условн.или-выражение [? выражение : выражение] | присваивание
конст.выражение= выражение
логическое выражение= выражение

Операторы (23)
оператор= помеченный оператор |
оператор-определение |
вставл.оператор
вставл.оператор= блок |
[оператор-выражение] ; |
оператор выбора |
оператор цикла |
оператор перехода |
try-оператор |
check-оператор |
lock-оператор |
using-оператор
блок= { {оператор} }
помеченный оператор= идентификатор : оператор
оператор-определение= опр.локал.переменной ; | опр.локал.константы ;
опр.локал.переменной= тип определитель переменной {, определитель переменной}
определитель переменной= идентификатор | идентификатор = инициализатор переменной
инициализатор переменной= выражение | инициализатор массива
опр.локал.константы= const тип определитель константы {, определитель константы}
определитель константы= идентификатор = конст.выражение
оператор-выражение= выражение-вызов |
выражение создания объекта |
присваивание |
первичное выражение [++ | --]+ |
[++ | -- ]+
первичное выражение
оператор выбора= if ( логическое выражение ) вставл.оператор [else вставл.оператор] |
switch ( выражение ) { { секция переключателя } }
секция переключателя= { метка переключателя } { оператор }
метка переключателя= case конст.выражение : |
default :
оператор цикла= while ( логическое выражение ) вставл.оператор |
do вставл.оператор while ( логическое выражение ) ; |
for ( [for-инициализатор] ; [логическое выражение] ; [for-итератор] ) вставл.оператор |
foreach ( тип идентификатор in выражение ) вставл.оператор
for-инициализатор= опр.локал.переменной | оператор-выражение {, оператор-выражение }
for-итератор= оператор-выражение {, оператор-выражение }
оператор перехода= break ; |
continue ; |
return [ выражение] ; |
throw [ выражение] ; |
goto идентификатор ; |
goto case конст.выражение ; |
goto default ;
try-оператор= try блок {catch-clauses}+[finally блок]
catch-clauses= catch [( тип класса [идентификатор] )] блок
check-оператор= [checked | unchecked ]+ блок
lock-оператор= lock ( выражение ) вставл.оператор
using-оператор= using ( опр.локал.переменной { catch ( [тип класса идентификатор] ) блок } выражение ) вставл.оператор