For comments/corrections/suggestions
asmldev@microsoft.com

A# Grammar

This file was generated directly from an LALR grammar. It was derived from the existing specifications for C#, Version 1.0 and Generics, Version 0.21. Asml Extensions are in red. 1 Lexical Grammar 1.1 Macros 1.1.1 Line terminators (A.1.1) 1.1.2 Whitespace (A.1.2) 1.1.3 Unicode character escape sequence (A.1.5) 1.1.4 Identifier (A.1.6) 1.1.5 Integer literal (A.1.8) 1.1.6 Real_literal (A.1.8) 1.1.7 Character_literal (A.1.8) 1.1.8 String_literal (A.1.8) 1.2 CSharp Scanner 1.3 Comments (A.1.3) 1.4 Documentation 1.5 Pre-Processing 1.6 Keywords 2 Syntactical Grammar 2.1 Literals (A 1.8) 2.2 Names 2.3 Empty 2.4 Types 2.4.1 Predefined Types 2.4.2 Type Expressions 2.4.3 Type Paramater 2.5 Expressions 2.5.1 Arrays (A.12) 2.5.2 Argument Lists 2.5.3 Simple Expression (also used for types) 2.5.4 Primary Expression 2.5.5 Member Access 2.5.6 Invocation Expression 2.5.7 Parenthesized Expression 2.5.8 Element Access or Filter Expression 2.5.9 This and Base Access 2.5.10 Post Increment 2.5.11 Object or Delegate Creation Expression 2.5.12 Data creation Expression 2.5.13 Array Creation expr 2.5.14 Typeof, Checked and Unchecked Expression 2.5.15 Cast Expression 2.5.16 Not and Complement Expression 2.5.17 Pre-Increment and Post-Increment 2.5.18 Unary Expression 2.5.19 Arithmetic and Relational exprs 2.5.20 Conditional Expression 2.5.21 Assignments 2.5.22 Expressions (Top Level) 2.5.23 Expression List 2.6 Statements 2.6.1 Expression Statements 2.6.2 Selection Statements 2.6.3 Iteration Statements 2.6.4 While and until Statements 2.6.5 For Statements 2.6.6 Foreach Statements 2.6.7 Choose Statements 2.6.8 Parallel and Transacted 2.6.9 Jump Statements 2.6.10 Exception Handling Statements 2.6.11 Checked and Unchecked Statements 2.6.12 Lock and Using Statements 2.6.13 Assertion Statements 2.6.14 Labelled Statement 2.6.15 Empty Statement 2.6.16 Blocks 2.6.17 Embedded Statements 2.6.18 Local Declaration 2.6.19 Statements (Top Level) 2.7 Declarations 2.7.1 Patterns and Bindings 2.7.2 Attributes 2.7.3 Modifiers 2.7.4 Constants 2.7.5 Fields 2.7.6 Methods 2.7.7 Properties 2.7.8 Type Abbrevations 2.8 Classes (A.2.6) 2.8.1 Events 2.8.2 Indexers 2.8.3 Operators 2.8.4 Constructors 2.8.5 Destructors 2.9 Structs (A.2.7) 2.10 Interfaces (A.2.9) 2.11 Enums (A.2.10) 2.12 Delegates (A.2.11) 2.13 Invariants 2.14 Compilation Unit
1 Lexical Grammar
1.1 Macros
1.1.1 Line terminators (A.1.1)
1.1.2 Whitespace (A.1.2)
1.1.3 Unicode character escape sequence (A.1.5)
1.1.4 Identifier (A.1.6)
1.1.5 Integer literal (A.1.8)
1.1.6 Real_literal (A.1.8)
1.1.7 Character_literal (A.1.8)
1.1.8 String_literal (A.1.8)
1.2 CSharp Scanner csharp_scanner'{whitespace}+': 'real_literal' '{real_literal}' 'regular_string_literal' '{regular_string_literal}' 'verbatim_string_literal' '{verbatim_string_literal}' 'character_literal' '{character_literal}' 'identifier' '{identifier}' 'identifier' '\@{identifier}|\@' '/\*' -> push delimited_comment_scanner '///' -> push documentation_comment_scanner '//' -> push single_line_comment_scanner '#' -> push preprocessing_directive_scanner '[' ']' '(' ')' '{' '}' '*' ',' ':' '=' ';' '?' '.' '..' '&' '+' '-' '~' '!' '/' '%' '|' '/' '&lt;' '<<' '>' '<=' '>=' '==' '!=' '^' '&&' '||' '++' '--' '*=' '/=' '%=' '+=' '-=' '<<=' '>>=' '&=' '^=' '|=' '->' '==>' '<==>'
1.3 Comments (A.1.3) delimited_comment_scanner'.': '{newline}' '\*/' -> pop single_line_comment_scanner'.': '{newline}' -> pop
1.4 Documentation documentation_comment_scanner'.*': '{newline}' -> pop
1.5 Pre-Processing preprocessing_directive_scanner'.': PIDENTIFIER,'pre_identifier' '{identifier}' 'pre_line' 'line' 'pre_warning' 'warning' 'pre_error' 'error' 'pre_define' 'define' 'pre_undef' 'undef' 'pre_if' 'if' 'pre_elif' 'elif' 'pre_else' 'else' 'pre_endif' 'endif' 'pre_and' '&&' 'pre_or' '\|\|' 'pre_not' '!' 'pre_true' 'true' 'pre_false' 'false' 'pre_oparen' '\(' 'pre_cparen' '\)' 'pre_eq' '==' 'pre_neq' '!=' 'pre_integer_literal' '{integer_literal}' 'pre_string_literal' '{regular_string_literal}' '[ \t]+' '{newline}' -> pop
1.6 Keywords 'abstract' 'allpublic' 'as' 'assert' 'base' 'bool' 'break' 'byte' 'case' 'catch' 'char' 'checked' 'choose' 'choose1' 'class' 'const' 'contract' 'continue' 'decimal' 'default' 'delegate' 'do' 'double' 'else' 'ensure' 'enum' 'enumof' 'event' 'explicit' 'event' 'extern' 'false' 'finally' 'float' 'for' 'foreach' 'goto' 'if' 'ifnone' 'implicit' 'in' 'int' 'interface' 'internal' 'invariant' 'is' 'let' 'lock' 'long' 'namespace' 'new' 'notin' 'null' 'object' 'operator' 'out' 'override' 'parallel' 'params' 'private' 'primitive' 'protected' 'public' 'readonly' 'structure' 'ref' 'require' 'return' 'sbyte' 'sealed' 'short' 'static' 'string' 'struct' 'switch' 'this' 'throw' 'throws' 'transaction' 'true' 'try' 'type' 'typeof' 'uint' 'ulong' 'unchecked' 'ushort' 'using' 'valueclass' 'var' 'virtual' 'void' 'volatile' 'while' 'where'
2 Syntactical Grammar startstart: compilation-unit
2.1 Literals (A 1.8) literal: true false integer-literal real-literal character-literal regular-string-literal verbatim-string-literal null
2.2 Names name: qualified-name simple-name simple-name: identifier identifier < simple-expr-list > simple-expr-list: simple-expr simple-expr-list , simple-expr qualified-name: name . simple-name
2.3 Empty empty:
2.4 Types
2.4.1 Predefined Types predefined-type: simple-type predefined-class-type void simple-type: numeric-type bool numeric-type: integral-type floating-point-type decimal integral-type: sbyte byte short ushort int uint long ulong char floating-point-type: float double predefined-class-type: object string
2.4.2 Type Expressions type: simple-expr primary-type: type
2.4.3 Type Paramater type-parameters: type-parameter type-parameters , type-parameter type-parameter-list: < type-parameters > type-parameter: attributesopt identifier type-param-cons-clauses: type-param-cons-clause type-param-cons-clauses type-param-cons-clause type-param-cons-clause: where type-parameter : type-param-cons-list type-param-cons-list: type-param-cons type-param-cons-list , type-param-cons type-param-cons: simple-expr new ( )
2.5 Expressions
2.5.1 Arrays (A.12) dim-separators: , dim-separators , rank-specifier: [ dim-separatorsopt ] rank-specifiers: rank-specifier rank-specifiers rank-specifier variable-initializer: expr array-initializer variable-initializers: variable-initializer variable-initializers , variable-initializer array-initializer: { variable-initializersopt } { variable-initializers , }
2.5.2 Argument Lists variable-ref: expr argument: expr ref variable-ref out variable-ref argument-list: argument argument-list , argument
2.5.3 Simple Expression (also used for types) simple-expr: simple-expr rank-specifiers simple-expr [ expr-list ] simple-no-rank-expr simple-no-rank-expr: name predefined-type < additive-expr-list , additive-expr > simple-expr ! additive-expr-list: additive-expr additive-expr-list , additive-expr
2.5.4 Primary Expression primary-expr: array-creation-expr no-array-creation-expr0 no-array-creation-expr0: parenthesized-expr no-array-creation-expr no-array-creation-expr: literal simple-expr member-access invocation-expr element-access-or-filter-expr this-access base-access post-increment-expr post-decrement-expr object-or-delegate-creation-expr typeof-expr enumof-expr checked-expr unchecked-expr comprehension anonymous-method-expr ( block )
2.5.5 Member Access
2.5.6 Invocation Expression invocation-expr: no-array-creation-expr ( argument-listopt )
2.5.7 Parenthesized Expression parenthesized-expr: ( expr )
2.5.8 Element Access or Filter Expression element-access-or-filter-expr: no-array-creation-expr0 [ expr-list ]
2.5.9 This and Base Access this-access: this base-access: base . identifier base [ expr-list ]
2.5.10 Post Increment post-increment-expr: no-array-creation-expr ++ post-decrement-expr: no-array-creation-expr --
2.5.11 Object or Delegate Creation Expression object-or-delegate-creation-expr: new simple-no-rank-expr ( argument-listopt )
2.5.12 Data creation Expression comprehension: simple-expr { } simple-expr { expr .. expr } simple-expr { generator-expr binding-list ifnone-expropt } simple-expr { binding-list ifnone-expropt } ifnone-expr: ifnone expr generator-expr: expr :
2.5.13 Array Creation expr array-creation-expr: new simple-no-rank-expr [ expr-list ] rank-specifiersopt array-initializeropt new simple-no-rank-expr [ dim-separatorsopt ] rank-specifiersopt array-initializer
2.5.14 Typeof, Checked and Unchecked Expression typeof-expr: typeof ( expr ) enumof-expr: enumof ( expr ) checked-expr: checked ( expr ) unchecked-expr: unchecked ( expr ) anonymous-method-expr: delegate ( formal-parametersopt ) block delegate block
2.5.15 Cast Expression cast-expr: ( expr ) primary-expr
2.5.16 Not and Complement Expression unary-expr-not-plusminus: primary-expr ! unary-expr ~ unary-expr cast-expr
2.5.17 Pre-Increment and Post-Increment pre-increment-expr: ++ unary-expr pre-decrement-expr: -- unary-expr
2.5.18 Unary Expression unary-expr: unary-expr-not-plusminus + unary-expr - unary-expr pre-increment-expr pre-decrement-expr
2.5.19 Arithmetic and Relational exprs multiplicative-expr: unary-expr multiplicative-expr * unary-expr multiplicative-expr / unary-expr multiplicative-expr % unary-expr additive-expr: multiplicative-expr additive-expr + multiplicative-expr additive-expr - multiplicative-expr shift-expr: additive-expr shift-expr << additive-expr shift-expr > > additive-expr shift-expr > additive-expr relational-expr: relational-expr < shift-expr relational-expr > shift-expr relational-expr <= shift-expr relational-expr >= shift-expr relational-expr is simple-expr relational-expr as simple-expr mapsto-expr: relational-expr relational-expr -> mapsto-expr equality-expr: mapsto-expr equality-expr in mapsto-expr equality-expr notin mapsto-expr equality-expr == mapsto-expr equality-expr != mapsto-expr and-expr: equality-expr and-expr & equality-expr exclusive-or-expr: and-expr exclusive-or-expr ^ and-expr inclusive-or-expr: exclusive-or-expr inclusive-or-expr | exclusive-or-expr
2.5.20 Conditional Expression conditional-and-expr: inclusive-or-expr conditional-and-expr && inclusive-or-expr conditional-or-expr: conditional-and-expr conditional-or-expr || conditional-and-expr conditional-implies-expr: conditional-or-expr conditional-implies-expr ==> conditional-or-expr conditional-iff-expr: conditional-implies-expr conditional-iff-expr <==> conditional-implies-expr conditional-expr: conditional-iff-expr conditional-iff-expr ? expr : expr
2.5.21 Assignments assignment: relational-expr assignment-operator expr assignment-operator: = += -= *= /= %= ^= |= &= >>= <<=
2.5.22 Expressions (Top Level) expr: conditional-expr assignment constant-expression: expr boolean-expr: expr
2.5.23 Expression List expr-list: expr expr-list , expr
2.6 Statements
2.6.1 Expression Statements statement-expression: expr expression-statement: expr semicolon
2.6.2 Selection Statements selection-statement: if-statement switch-statement if-statement: if ( expr ) embedded-statement else embedded-statement if ( expr ) embedded-statement switch-statement: switch ( expr ) switch-block switch-block: { switch-sectionsopt } switch-sections: switch-section switch-sections switch-section switch-section: switch-labels statement-list switch-labels: switch-label switch-labels switch-label switch-label: case type simple-expr where-clauseopt : case additive-expr as type where-clauseopt : case additive-expr where-clauseopt : default :
2.6.3 Iteration Statements iteration-statement: while-statement do-statement for-statement foreach-statement choose-statement
2.6.4 While and until Statements while-statement: while-sel ( boolean-expr ) embedded-statement do-statement: do embedded-statement while ( boolean-expr ) semicolon while-sel: while
2.6.5 For Statements for-statement: for ( for-initializeropt semicolon for-conditionopt semicolon for-iteratoropt ) embedded-statement for-initializer: local-variable-decl statement-expression-list for-condition: boolean-expr for-iterator: statement-expression-list statement-expression-list: statement-expression statement-expression-list , statement-expression
2.6.6 Foreach Statements foreach-statement: foreach-sel parallelopt ( binding-list ) embedded-statement foreach-sel: foreach
2.6.7 Choose Statements choose-statement: choose ( binding-list ) embedded-statement choose ( binding-list ) embedded-statement else embedded-statement choose1 ( binding-list ) embedded-statement choose1 ( binding-list ) embedded-statement else embedded-statement
2.6.8 Parallel and Transacted parallel-statement: parallel embedded-statement transaction-statement: transaction embedded-statement
2.6.9 Jump Statements jump-statement: break-statement continue-statement goto-statement return-statement throw-statement break-statement: break semicolon continue-statement: continue semicolon goto-statement: goto identifier semicolon goto default semicolon goto case literal semicolon return-statement: return expr semicolon return semicolon semicolon: ;
2.6.10 Exception Handling Statements throw-statement: throw expropt semicolon try-statement: try-sel block catch-clauses try-sel block finally-clause try-sel block catch-clauses finally-clause try-sel: try catch-clauses: catch-clause catch-clauses catch-clause catch-clause: catch ( pattern ) block catch block finally-clause: finally block
2.6.11 Checked and Unchecked Statements checked-statement: checked block unchecked-statement: unchecked block
2.6.12 Lock and Using Statements lock-statement: lock ( expr ) embedded-statement using-statement: using ( resource-acquisition ) embedded-statement resource-acquisition: local-variable-decl expr
2.6.13 Assertion Statements assert invariant assertion-statement: assertion-modifier expr expr-if-labelopt semicolon throws-statement: throws expropt expr-if-labelopt throws-exception-listopt semicolon
2.6.14 Labelled Statement labeled-statement: identifier : statement
2.6.15 Empty Statement empty-statement: ;
2.6.16 Blocks block: { } { statement-list } statement-list: statement statement-list statement
2.6.17 Embedded Statements embedded-statement: block empty-statement expression-statement selection-statement iteration-statement jump-statement try-statement checked-statement unchecked-statement lock-statement using-statement assertion-statement throws-statement parallel-statement transaction-statement
2.6.18 Local Declaration decl-statement: local-variable-decl semicolon local-variable-decl: local-variable-mod variable-declarators local-variable-mod: var let const readonly
2.6.19 Statements (Top Level) statement: labeled-statement embedded-statement decl-statement
2.7 Declarations
2.7.1 Patterns and Bindings pattern-nodecl: simple-expr pattern: type pattern pattern-nodecl where-clause: where conditional-expr binding: expr expr identifier = expr expr identifier in expr binding-list: bindings bindings: binding bindings , binding
2.7.2 Attributes attributes: attribute-section attributes attribute-section attribute-section: [ attribute-list ] attribute-list: attribute attribute-list , attribute attribute: attribute-name attribute-name ( attribute-arguments ) attribute-target attribute-name attribute-target attribute-name ( attribute-arguments ) attribute-name: name attribute-target: attribute-target-name : attribute-target-name: identifier namespace event return type0 attribute-arguments: empty positional-argument-list positional-argument-list , named-argument-list named-argument-list positional-argument-list: positional-argument positional-argument-list , positional-argument positional-argument: conditional-expr named-argument-list: named-argument named-argument-list , named-argument named-argument: identifier = expr parameter-modifier: empty ref out readonly params formal-parameter: attributesopt formal-parameter1 formal-parameter1: transactedopt parameter-modifier simple-expr identifier formal-parameters: formal-parameter formal-parameters , formal-parameter
2.7.3 Modifiers modifiers: modifier modifiers modifier modifier: abstract extern internal override private protected public sealed static allpublic virtual volatile new
2.7.4 Constants
2.7.5 Fields variable-declarators: variable-declarator variable-declarators , variable-declarator variable-declarator: identifier pattern-nodecl = variable-initializer field-decl: attributesopt modifiersopt simple-expr variable-declarators semicolon attributesopt modifiersopt field-variable-mod simple-expr variable-declarators semicolon attributesopt modifiersopt field-variable-mod variable-declarators semicolon field-variable-mod: const readonly var primitive
2.7.6 Methods method-decl: method-header method-body method-header: attributesopt modifiersopt simple-expr name ( formal-parametersopt ) type-param-cons-clausesopt method-body: method-contractopt block method-contract ; method-contract: method-conditions method-conditions: method-condition method-conditions method-condition method-condition: let variable-declarators semicolon let type variable-declarators semicolon require expr expr-if-labelopt semicolon ensure expr expr-if-labelopt semicolon throws-statement throws-exception-list: , expr-list
2.7.7 Properties property-decl: attributesopt modifiersopt simple-expr name { accessor-decls } accessor-decls: accessor-decl accessor-decl accessor-decl accessor-decl: attributesopt modifiersopt accessor-name method-body accessor-name: identifier
2.7.8 Type Abbrevations type-alias: attributesopt modifiersopt type0 identifier type-parameter-listopt type-param-cons-clausesopt = type constraintopt semicolon attributesopt modifiersopt type0 identifier type-parameter-listopt type-param-cons-clausesopt semicolon constraint: where boolean-expr
2.8 Classes (A.2.6) class-decl: attributesopt modifiersopt class-or-valueclass identifier type-parameter-listopt class-baseopt type-param-cons-clausesopt class-body commaopt class-or-valueclass: class valueclass structure case class-base: : name : predefined-class-type : name , interface-types : predefined-class-type , interface-types interface-types: name interface-types , name class-body: { class-member-declsopt } class-member-decls: class-member-decl class-member-decls class-member-decl class-member-decl: field-decl method-decl property-decl event-decl indexer-decl class-decl struct-decl operator-decl constructor-decl destructor-decl type-alias invariant-decl enum-decl delegate-decl interface-decl default-decl
2.8.1 Events event-decl: attributesopt modifiersopt event type variable-declarators semicolon attributesopt modifiersopt event type member-name { accessor-decls } member-name: name
2.8.2 Indexers indexer-decl: attributesopt modifiersopt simple-expr name-dotopt this [ formal-parameters ] { accessor-decls } name-dot: name .
2.8.3 Operators operator-decl: attributesopt modifiersopt primary-type operator overloadable-operator-sel op-type-paramsopt ( operator-param second-paramopt ) type-param-cons-clausesopt method-body op-type-params: < type-parameters > operator-decl: attributesopt modifiersopt implicit-or-explicit op-type-paramsopt operator primary-type ( operator-param ) type-param-cons-clausesopt method-body operator-param: parameter-modifier type identifier overloadable-operator-sel: overloadable-operator overloadable-operator: - ! ~ ++ -- true false * / % & | ^ << == != > < >= <= in notin implicit-or-explicit: implicit explicit
2.8.4 Constructors constructor-decl: attributesopt modifiersopt identifier ( formal-parametersopt ) constructor-initializeropt method-body constructor-initializer: : base ( argument-listopt ) : this ( argument-listopt )
2.8.5 Destructors destructor-decl: attributesopt modifiersopt ~ identifier ( ) block
2.9 Structs (A.2.7) struct-decl: attributesopt modifiersopt struct identifier type-parameter-listopt struct-interfacesopt type-param-cons-clausesopt struct-body commaopt struct-interfaces: : interface-types struct-body: { struct-member-declsopt } struct-member-decls: struct-member-decl struct-member-decls struct-member-decl struct-member-decl: field-decl method-decl property-decl event-decl indexer-decl operator-decl constructor-decl type-alias invariant-decl class-decl enum-decl delegate-decl
2.10 Interfaces (A.2.9) interface-decl: attributesopt modifiersopt interface identifier type-parameter-listopt interface-baseopt type-param-cons-clausesopt interface-body commaopt interface-base: : interface-types interface-body: { interface-member-declsopt } interface-member-decls: interface-member-decl interface-member-decls interface-member-decl interface-member-decl: interface-method-decl interface-property-decl interface-event-decl indexer-decl interface-method-decl: method-decl interface-property-decl: property-decl interface-event-decl: event-decl interface-member-decl: invariant-decl field-decl
2.11 Enums (A.2.10) enum-decl: attributesopt modifiersopt enum identifier enum-baseopt enum-body commaopt enum-base: : integral-type enum-body: { enum-member-declsopt } { enum-member-decls , } enum-member-decls: enum-member-decl enum-member-decls , enum-member-decl enum-member-decl: attributesopt identifier attributesopt identifier = constant-expression
2.12 Delegates (A.2.11) delegate-decl: attributesopt modifiersopt delegate type identifier type-parameter-listopt ( formal-parametersopt ) type-param-cons-clausesopt semicolon
2.13 Invariants invariant-decl: attributesopt modifiersopt invariant expr expr-if-labelopt semicolon expr-if-label: : expr
2.14 Compilation Unit compilation-unit: using-directivesopt attributesopt using-directivesopt namespace-member-decls namespace-decl: attributesopt namespace namespace-name namespace-body commaopt namespace-body: { using-directivesopt namespace-member-declsopt } semicolon using-directivesopt namespace-name: name namespace-member-decls: namespace-member-decls namespace-member-decl namespace-member-decl namespace-member-decl: namespace-decl type-decl using-directives: using-directive using-directives using-directive using-directive: using-alias-directive using-namespace-directive using-alias-directive: using allpublicopt identifier = namespace-name semicolon using-namespace-directive: using allpublicopt namespace-name semicolon type-decl: class-decl method-decl operator-decl field-decl property-decl invariant-decl struct-decl interface-decl enum-decl delegate-decl default-decl type-alias default-decl: default modifier ;