mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1375 lines
33 KiB
1375 lines
33 KiB
using System; |
|
using System.Collections; |
|
using System.Collections.Generic; |
|
|
|
PUSHCOMPILER WITH EXPECTEDSETS ExpressionFinder |
|
|
|
/* START AUTOGENERATED TOKENS SECTION */ |
|
TOKENS |
|
/* ----- terminal classes ----- */ |
|
/* EOF is 0 */ |
|
EOL |
|
ident |
|
LiteralString |
|
LiteralCharacter |
|
LiteralInteger |
|
LiteralDouble |
|
LiteralSingle |
|
LiteralDecimal |
|
LiteralDate |
|
XmlOpenTag |
|
XmlCloseTag |
|
XmlStartInlineVB |
|
XmlEndInlineVB |
|
XmlCloseTagEmptyElement |
|
XmlOpenEndTag |
|
XmlContent |
|
XmlComment |
|
XmlCData |
|
XmlProcessingInstruction |
|
|
|
/* ----- special character ----- */ |
|
"=" |
|
":" |
|
"," |
|
"&" |
|
"/" |
|
"\\" |
|
"." |
|
"..." |
|
".@" |
|
"!" |
|
"-" |
|
"+" |
|
"^" |
|
"?" |
|
"*" |
|
"{" |
|
"}" |
|
"(" |
|
")" |
|
">" |
|
"<" |
|
"<>" |
|
">=" |
|
"<=" |
|
"<<" |
|
">>" |
|
"+=" |
|
"^=" |
|
"-=" |
|
"*=" |
|
"/=" |
|
"\\=" |
|
"<<=" |
|
">>=" |
|
"&=" |
|
":=" |
|
|
|
/* ----- keywords ----- */ |
|
"AddHandler" |
|
"AddressOf" |
|
"Aggregate" |
|
"Alias" |
|
"And" |
|
"AndAlso" |
|
"Ansi" |
|
"As" |
|
"Ascending" |
|
"Assembly" |
|
"Auto" |
|
"Binary" |
|
"Boolean" |
|
"ByRef" |
|
"By" |
|
"Byte" |
|
"ByVal" |
|
"Call" |
|
"Case" |
|
"Catch" |
|
"CBool" |
|
"CByte" |
|
"CChar" |
|
"CDate" |
|
"CDbl" |
|
"CDec" |
|
"Char" |
|
"CInt" |
|
"Class" |
|
"CLng" |
|
"CObj" |
|
"Compare" |
|
"Const" |
|
"Continue" |
|
"CSByte" |
|
"CShort" |
|
"CSng" |
|
"CStr" |
|
"CType" |
|
"CUInt" |
|
"CULng" |
|
"CUShort" |
|
"Custom" |
|
"Date" |
|
"Decimal" |
|
"Declare" |
|
"Default" |
|
"Delegate" |
|
"Descending" |
|
"Dim" |
|
"DirectCast" |
|
"Distinct" |
|
"Do" |
|
"Double" |
|
"Each" |
|
"Else" |
|
"ElseIf" |
|
"End" |
|
"EndIf" |
|
"Enum" |
|
"Equals" |
|
"Erase" |
|
"Error" |
|
"Event" |
|
"Exit" |
|
"Explicit" |
|
"False" |
|
"Finally" |
|
"For" |
|
"Friend" |
|
"From" |
|
"Function" |
|
"Get" |
|
"GetType" |
|
"Global" |
|
"GoSub" |
|
"GoTo" |
|
"Group" |
|
"Handles" |
|
"If" |
|
"Implements" |
|
"Imports" |
|
"In" |
|
"Infer" |
|
"Inherits" |
|
"Integer" |
|
"Interface" |
|
"Into" |
|
"Is" |
|
"IsNot" |
|
"Join" |
|
"Key" |
|
"Let" |
|
"Lib" |
|
"Like" |
|
"Long" |
|
"Loop" |
|
"Me" |
|
"Mod" |
|
"Module" |
|
"MustInherit" |
|
"MustOverride" |
|
"MyBase" |
|
"MyClass" |
|
"Namespace" |
|
"Narrowing" |
|
"New" |
|
"Next" |
|
"Not" |
|
"Nothing" |
|
"NotInheritable" |
|
"NotOverridable" |
|
"Object" |
|
"Of" |
|
"Off" |
|
"On" |
|
"Operator" |
|
"Option" |
|
"Optional" |
|
"Or" |
|
"Order" |
|
"OrElse" |
|
"Out" |
|
"Overloads" |
|
"Overridable" |
|
"Overrides" |
|
"ParamArray" |
|
"Partial" |
|
"Preserve" |
|
"Private" |
|
"Property" |
|
"Protected" |
|
"Public" |
|
"RaiseEvent" |
|
"ReadOnly" |
|
"ReDim" |
|
"Rem" |
|
"RemoveHandler" |
|
"Resume" |
|
"Return" |
|
"SByte" |
|
"Select" |
|
"Set" |
|
"Shadows" |
|
"Shared" |
|
"Short" |
|
"Single" |
|
"Skip" |
|
"Static" |
|
"Step" |
|
"Stop" |
|
"Strict" |
|
"String" |
|
"Structure" |
|
"Sub" |
|
"SyncLock" |
|
"Take" |
|
"Text" |
|
"Then" |
|
"Throw" |
|
"To" |
|
"True" |
|
"Try" |
|
"TryCast" |
|
"TypeOf" |
|
"UInteger" |
|
"ULong" |
|
"Unicode" |
|
"Until" |
|
"UShort" |
|
"Using" |
|
"Variant" |
|
"Wend" |
|
"When" |
|
"Where" |
|
"While" |
|
"Widening" |
|
"With" |
|
"WithEvents" |
|
"WriteOnly" |
|
"Xor" |
|
"GetXmlNamespace" |
|
/* END AUTOGENERATED TOKENS SECTION */ |
|
|
|
PRODUCTIONS |
|
/*------------------------------------------------------------------------*/ |
|
ExpressionFinder = |
|
(. PushContext(Context.Global, la, t); .) |
|
{ OptionStatement } |
|
{ ImportsStatement } |
|
{ EXPECTEDCONFLICT("<") AttributeBlock } /* Expected LL(1) conflict: we can't tell global attributes */ |
|
/* from those on types. */ |
|
/* This isn't a problem, we can just treat all as global attributes */ |
|
{ NamespaceMemberDeclaration } |
|
(. PopContext(); .) |
|
. |
|
|
|
StatementTerminator |
|
(. if (la != null) CurrentBlock.lastExpressionStart = la.Location; .) |
|
= |
|
EOL | ":" |
|
. |
|
|
|
OptionStatement = |
|
"Option" ( ( "Explicit" | "Strict" | "Infer" ) [ "Off" | "On" ] | "Compare" ( "Text" | "Binary" ) ) StatementTerminator |
|
. |
|
|
|
ImportsStatement = |
|
"Imports" (. PushContext(Context.Importable, la, t); .) |
|
(. nextTokenIsStartOfImportsOrAccessExpression = true; .) |
|
( |
|
( "Global" | Identifier | PrimitiveTypeName ) { TypeSuffix } [ ( "." | "=" ) TypeName ] |
|
| XmlOpenTag Identifier "=" LiteralString XmlCloseTag |
|
) |
|
{ "," |
|
(. nextTokenIsStartOfImportsOrAccessExpression = true; .) |
|
( |
|
( "Global" | Identifier | PrimitiveTypeName ) { TypeSuffix } [ ( "." | "=" ) TypeName ] |
|
| XmlOpenTag Identifier "=" LiteralString XmlCloseTag |
|
) |
|
} |
|
(. PopContext(); .) |
|
StatementTerminator |
|
|
|
. |
|
|
|
AttributeBlock = |
|
"<" (. wasNormalAttribute = true; PushContext(Context.Attribute, la, t); .) [ ( "Assembly" | "Module" ) ":" (. wasNormalAttribute = false; .) ] { ANY } ">" (. PopContext(); .) [ EOL ] |
|
. |
|
|
|
NamespaceMemberDeclaration = |
|
NamespaceDeclaration |
|
| TypeDeclaration |
|
. |
|
|
|
NamespaceDeclaration = |
|
"Namespace" (. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) { ANY } (. PopContext(); .) StatementTerminator |
|
{ NamespaceMemberDeclaration } |
|
"End" "Namespace" StatementTerminator |
|
. |
|
|
|
TypeDeclaration = |
|
{ AttributeBlock } |
|
{ TypeModifier } |
|
( ClassOrModuleOrStructureTypeDeclaration | |
|
DelegateTypeDeclaration | |
|
EnumTypeDeclaration | |
|
InterfaceDeclaration ) |
|
. |
|
|
|
ClassOrModuleOrStructureTypeDeclaration = |
|
(. PushContext(Context.TypeDeclaration, la, t); .) |
|
( "Module" | "Class" | "Structure" ) (. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier (. PopContext(); .) |
|
[ "(" "Of" GenericTypeParameterDeclaration ")" ] StatementTerminator |
|
[ (. isMissingModifier = false; .) "Inherits" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) StatementTerminator ] |
|
[ (. isMissingModifier = false; .) "Implements" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) { "," (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) } StatementTerminator ] |
|
{ |
|
{ AttributeBlock } (.OnEachPossiblePath: isMissingModifier = true; .) |
|
{ TypeOrMemberModifier (. isMissingModifier = false; .) } (. isMissingModifier = false; .) |
|
( ClassOrModuleOrStructureTypeDeclaration | DelegateTypeDeclaration | EnumTypeDeclaration |
|
| InterfaceDeclaration | MemberDeclaration ) |
|
} |
|
(. isMissingModifier = false; .) |
|
"End" ( "Module" | "Class" | "Structure" ) StatementTerminator |
|
(. PopContext(); .) |
|
. |
|
|
|
EnumTypeDeclaration = |
|
(. PushContext(Context.TypeDeclaration, la, t); .) |
|
"Enum" (. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier (. PopContext(); .) |
|
[ "As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ] StatementTerminator |
|
{ |
|
{ AttributeBlock } |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier (. PopContext(); .) |
|
[ "=" Expression ] |
|
StatementTerminator |
|
} |
|
"End" "Enum" StatementTerminator |
|
(. PopContext(); .) |
|
. |
|
|
|
InterfaceDeclaration = |
|
(. PushContext(Context.TypeDeclaration, la, t); .) |
|
"Interface" (. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier (. PopContext(); .) |
|
[ "(" "Of" GenericTypeParameterDeclaration ")" ] StatementTerminator |
|
[ "Inherits" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) { "," (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) } StatementTerminator ] |
|
{ |
|
{ AttributeBlock } (.OnEachPossiblePath: isMissingModifier = true; .) |
|
{ TypeOrMemberModifier (. isMissingModifier = false; .) } (. isMissingModifier = false; .) |
|
( ClassOrModuleOrStructureTypeDeclaration | DelegateTypeDeclaration | EnumTypeDeclaration |
|
| InterfaceDeclaration | InterfaceMemberDeclaration ) |
|
} |
|
(. isMissingModifier = false; .) |
|
"End" "Interface" StatementTerminator |
|
(. PopContext(); .) |
|
. |
|
|
|
InterfaceMemberDeclaration = |
|
InterfaceEvent | InterfaceProperty | InterfaceSubOrFunction |
|
. |
|
|
|
TypeOrMemberModifier = |
|
MemberModifier /* contains all modifiers for types */ |
|
. |
|
|
|
InterfaceEvent = |
|
"Event" (. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier (. PopContext(); .) |
|
[ "As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) | ParameterListInParenthesis ] |
|
StatementTerminator |
|
. |
|
|
|
InterfaceProperty = |
|
"Property" (. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier (. PopContext(); .) |
|
[ ParameterListInParenthesis ] [ "As" (. PushContext(Context.Type, la, t); .) { AttributeBlock } TypeName (. PopContext(); .) ] |
|
StatementTerminator |
|
. |
|
|
|
InterfaceSubOrFunction = |
|
("Sub" | "Function") |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) ANY (. PopContext(); .) |
|
{ "(" [ ( "Of" GenericTypeParameterDeclaration | ParameterList ) ] ")" } |
|
[ "As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ] |
|
StatementTerminator |
|
. |
|
|
|
GenericConstraint = |
|
TypeName | "New" | "Class" | "Structure" |
|
. |
|
|
|
GenericConstraintList = |
|
GenericConstraint | "{" GenericConstraint { "," GenericConstraint } "}" |
|
. |
|
|
|
GenericTypeParameterDeclaration = |
|
[ "Out" | "In" ] (. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) IdentifierExceptOut (. PopContext(); .) [ "As" (. PushContext(Context.Type, la, t); .) GenericConstraintList (. PopContext(); .) ] |
|
{ "," [ "Out" | "In" ] (. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) IdentifierExceptOut (. PopContext(); .) [ "As" (. PushContext(Context.Type, la, t); .) GenericConstraintList (. PopContext(); .) ] } |
|
. |
|
|
|
DelegateTypeDeclaration = |
|
"Delegate" ("Sub" | "Function") |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) ANY (. PopContext(); .) |
|
{ "(" [ "Of" GenericTypeParameterDeclaration | ParameterList ] ")" } |
|
[ "As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ] |
|
StatementTerminator |
|
. |
|
|
|
MemberDeclaration = |
|
(. PushContext(Context.Member, la, t); .) |
|
( |
|
MemberVariableOrConstantDeclaration | |
|
SubOrFunctionDeclaration | |
|
ExternalMemberDeclaration | |
|
EventMemberDeclaration | |
|
CustomEventMemberDeclaration | |
|
PropertyDeclaration | |
|
OperatorDeclaration |
|
) |
|
(. PopContext(); .) |
|
. |
|
|
|
SubOrFunctionDeclaration = |
|
("Sub" | "Function") |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) ANY (. PopContext(); .) |
|
{ "(" [ ( "Of" GenericTypeParameterDeclaration | ParameterList ) ] ")" } |
|
[ "As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ] |
|
[ ( "Implements" | "Handles" ) [ ( "Me" | "MyClass" | "MyBase" ) "." ] TypeName ] |
|
StatementTerminatorAndBlock |
|
"End" ("Sub" | "Function") StatementTerminator |
|
. |
|
|
|
ExternalMemberDeclaration = |
|
"Declare" [ "Ansi" | "Unicode" | "Auto" ] ( "Sub" | "Function" ) |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier (. PopContext(); .) |
|
"Lib" LiteralString |
|
[ "Alias" LiteralString ] |
|
[ ParameterListInParenthesis ] |
|
[ "As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ] |
|
StatementTerminator |
|
. |
|
|
|
EventMemberDeclaration = |
|
"Event" |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier (. PopContext(); .) |
|
( "As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) | [ ParameterListInParenthesis ] ) |
|
[ "Implements" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) /*"." IdentifierOrKeyword*/ |
|
{ "," (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) /*"." IdentifierOrKeyword*/ } ] |
|
/* the TypeName production already allows the "." IdentifierOrKeyword syntax, so to avoid an ambiguous grammar we just leave that out */ |
|
StatementTerminator |
|
. |
|
|
|
CustomEventMemberDeclaration = |
|
"Custom" EventMemberDeclaration |
|
{ |
|
{ AttributeBlock } ( "AddHandler" | "RemoveHandler" | "RaiseEvent" ) "(" ParameterList ")" |
|
StatementTerminatorAndBlock |
|
"End" ( "AddHandler" | "RemoveHandler" | "RaiseEvent" ) StatementTerminator |
|
} |
|
"End" "Event" StatementTerminator |
|
. |
|
|
|
PropertyDeclaration = |
|
"Property" |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier (. PopContext(); .) |
|
[ ParameterListInParenthesis ] |
|
[ "As" (. PushContext(Context.Type, la, t); .) { AttributeBlock } ( NewExpression | TypeName ) (. PopContext(); .) ] |
|
[ "Implements" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) /*"." IdentifierOrKeyword*/ |
|
{ "," (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) /*"." IdentifierOrKeyword*/ } ] |
|
[ "=" Expression ] StatementTerminator |
|
(. PopContext(); .) { EXPECTEDCONFLICT("<") AttributeBlock } |
|
{ EXPECTEDCONFLICT("Public", "Protected", "Private", "Friend") AccessModifier |
|
// HACK : OnEachPossiblePath cannot detect that this might be the end of an auto property |
|
// so we need to simulate it |
|
(.OnEachPossiblePath: SetIdentifierExpected(la); .) } |
|
[ (. PushContext(Context.Member, la, t); .) |
|
( "Get" | "Set" ) [ ParameterListInParenthesis ] |
|
StatementTerminatorAndBlock |
|
"End" ( "Get" | "Set" ) StatementTerminator |
|
[ { AttributeBlock } { AccessModifier } ( "Get" | "Set" ) [ ParameterListInParenthesis ] |
|
StatementTerminatorAndBlock |
|
"End" ( "Get" | "Set" ) StatementTerminator ] |
|
|
|
"End" "Property" StatementTerminator ] |
|
. |
|
|
|
OperatorDeclaration = |
|
"Operator" (. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) ANY (. PopContext(); .) |
|
"(" ParameterList ")" |
|
[ "As" (. PushContext(Context.Type, la, t); .) { AttributeBlock } TypeName (. PopContext(); .) ] |
|
StatementTerminatorAndBlock |
|
"End" "Operator" StatementTerminator |
|
. |
|
|
|
MemberVariableOrConstantDeclaration = |
|
MemberVariableOrConstantDeclarator { "," MemberVariableOrConstantDeclarator } StatementTerminator |
|
. |
|
|
|
MemberVariableOrConstantDeclarator = |
|
[ "Const" ] |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) IdentifierForFieldDeclaration (. PopContext(); .) |
|
[ "?" ] { "(" [ Expression ] { "," [ Expression ] } ")" } |
|
[ "As" (. PushContext(Context.Type, la, t); .) ( NewExpression | TypeName ) (. PopContext(); .) ] |
|
[ "=" Expression ] |
|
. |
|
|
|
ParameterList = |
|
Parameter { "," Parameter } |
|
. |
|
|
|
Parameter = |
|
(. PushContext(Context.Parameter, la, t); .) |
|
{ AttributeBlock } { ParameterModifier } |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier (. PopContext(); .) |
|
[ "?" ] { "(" { "," } ")" } |
|
[ "As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ] |
|
[ "=" Expression ] |
|
(. PopContext(); .) |
|
. |
|
|
|
StatementTerminatorAndBlock = |
|
(. PushContext(Context.Body, la, t); .) |
|
StatementTerminator |
|
{ EXPECTEDCONFLICT("End") |
|
( |
|
[ Statement] StatementTerminator |
|
| "End" |
|
( StatementTerminator /* End+StatementTerminator is end statement */ |
|
| /* End+anything else is the end of this block. */ |
|
(. |
|
currentState = endOfStatementTerminatorAndBlock; /* leave this block */ |
|
InformToken(t); /* process End again*/ |
|
/* for processing current token (la): go to the position after processing End */ |
|
goto switchlbl; |
|
.) |
|
ANY /* never reached due to goto above: */ |
|
/* this ANY is just so that Coco knows this branch isn't empty */ |
|
) |
|
) |
|
} |
|
(.NamedState:endOfStatementTerminatorAndBlock.) |
|
(. PopContext(); .) |
|
. |
|
|
|
Expression |
|
(.NamedState:startOfExpression.) |
|
= |
|
(. PushContext(Context.Expression, la, t); .) |
|
SimpleExpressionWithSuffix { BinaryOperator SimpleExpressionWithSuffix } |
|
(. PopContext(); .) |
|
. |
|
|
|
BinaryOperator = |
|
"+" | "-" | "*" | "\\" | "/" | "^" | "Mod" |
|
| "=" | "<>" | "<" | ">" (. wasNormalAttribute = false; .) | "<=" | ">=" |
|
| "Like" | "&" | "And" | "AndAlso" | "Or" | "OrElse" |
|
| "Xor" | "<<" | ">>" | "Is" | "IsNot" |
|
| "^=" | "*=" | "/=" | "\\=" | "+=" | "-=" | "&=" | "<<=" | ">>=" | "To" | ":=" |
|
. |
|
|
|
UnaryOperator = |
|
"+" | "-" | "Not" | "AddressOf" |
|
. |
|
|
|
SimpleExpressionWithSuffix = |
|
(. PushContext(Context.Expression, la, t); .) |
|
{ UnaryOperator } |
|
( |
|
SimpleExpression { ExpressionSuffix } |
|
| "TypeOf" SimpleExpressionWithSuffix "Is" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) |
|
| NewExpression |
|
| CollectionInitializer |
|
) |
|
(. PopContext(); .) |
|
. |
|
|
|
SimpleExpression = |
|
(. PushContext(Context.Expression, la, t); .) |
|
( Literal |
|
| ( "(" (. activeArgument = 0; .) Expression // HACK in ExpressionRangeVariable Identifier is consumed before start |
|
// of Expression so this can be an argument list too |
|
{ "," (. activeArgument++; .) Expression } ")" ) |
|
| IdentifierForExpressionStart |
|
| PrimitiveTypeName |
|
| ( "." | "!" | ".@" | "..." ) (. nextTokenIsStartOfImportsOrAccessExpression = true; wasQualifierTokenAtStart = true; .) [ XmlOpenTag ] IdentifierOrKeyword [ XmlCloseTag ] |
|
| "GetType" "(" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ")" |
|
| "GetXmlNamespace" "(" (. readXmlIdentifier = true; .) Identifier ")" |
|
| XmlLiteral |
|
| LambdaExpression |
|
| GREEDY QueryExpression |
|
| CastExpression |
|
| ConditionalExpression |
|
) |
|
(. PopContext(); .) |
|
. |
|
|
|
NewExpression = |
|
"New" (. PushContext(Context.ObjectCreation, la, t); .) |
|
( |
|
TypeName |
|
[ |
|
EXPECTEDCONFLICT("From") |
|
( |
|
(. PushContext(Context.CollectionInitializer, la, t); .) |
|
"From" |
|
( |
|
CollectionInitializer /* From + CollectionInitializer is a NewExpression */ |
|
| |
|
(. |
|
currentState = endOfStatementTerminatorAndBlock; /* leave this block */ |
|
InformToken(t); /* process From again*/ |
|
/* for processing current token (la): go to the position after processing End */ |
|
goto switchlbl; |
|
.) |
|
ANY /* never reached due to goto above: */ |
|
/* this ANY is just so that Coco knows this branch isn't empty */ |
|
) |
|
(. PopContext(); .) |
|
| |
|
/* handle array initializer after New */ |
|
(. PushContext(Context.CollectionInitializer, la, t); .) |
|
CollectionInitializer |
|
(. PopContext(); .) |
|
| |
|
(. PushContext(Context.ObjectInitializer, la, t); .) |
|
"With" ObjectInitializer |
|
(. PopContext(); .) |
|
) |
|
] |
|
| |
|
(. PushContext(Context.ObjectInitializer, la, t); .) |
|
"With" ObjectInitializer |
|
(. PopContext(); .) |
|
) |
|
(. PopContext(); .) |
|
. |
|
|
|
ObjectInitializer = |
|
"{" [ [ "Key" ] "." IdentifierOrKeyword "=" Expression { "," [ "Key" ] "." IdentifierOrKeyword "=" Expression } ] "}" |
|
. |
|
|
|
CollectionInitializer = |
|
"{" [ Expression { "," Expression } ] "}" |
|
. |
|
|
|
ExpressionSuffix = |
|
"(" (. PushContext(Context.Expression, la, t); .) |
|
( "Of" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) |
|
{ "," (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) } |
|
| [ ArgumentList ] ) (. PopContext(); .) ")" |
|
| ( "." | "!" | ".@" | "..." ) (. nextTokenIsStartOfImportsOrAccessExpression = true; .) [ XmlOpenTag ] IdentifierOrKeyword [ XmlCloseTag ] |
|
. |
|
|
|
CastExpression = |
|
SimpleCastExpression | ("DirectCast" | "TryCast" | "CType") "(" Expression "," (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ")" |
|
. |
|
|
|
SimpleCastExpression = |
|
( |
|
"CBool" | |
|
"CByte" | |
|
"CChar" | |
|
"CDate" | |
|
"CDec" | |
|
"CDbl" | |
|
"CInt" | |
|
"CLng" | |
|
"CObj" | |
|
"CSByte" | |
|
"CShort" | |
|
"CSng" | |
|
"CStr" | |
|
"CUInt" | |
|
"CULng" | |
|
"CUShort" |
|
) |
|
"(" Expression ")" |
|
. |
|
|
|
ConditionalExpression = |
|
"If" "(" Expression "," Expression [ "," Expression ] ")" |
|
. |
|
|
|
LambdaExpression = |
|
SubLambdaExpression | |
|
FunctionLambdaExpression |
|
. |
|
|
|
SubLambdaExpression = |
|
"Sub" ParameterListInParenthesis |
|
( GREEDY Statement | StatementTerminatorAndBlock "End" "Sub" ) |
|
. |
|
|
|
FunctionLambdaExpression = |
|
"Function" ParameterListInParenthesis |
|
( GREEDY Expression | [ "As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ] StatementTerminatorAndBlock "End" "Function" ) |
|
. |
|
|
|
ParameterListInParenthesis = |
|
"(" (. PushContext(Context.Default, la, t); .) [ ParameterList ] (. PopContext(); .) ")" |
|
. |
|
|
|
QueryExpression |
|
(. PushContext(Context.Query, la, t); .) |
|
= |
|
( FromQueryOperator | AggregateQueryOperator ) |
|
{ QueryOperator } |
|
(. PopContext(); .) |
|
. |
|
|
|
QueryOperator = |
|
FromQueryOperator |
|
| AggregateQueryOperator |
|
| SelectQueryOperator |
|
| DistinctQueryOperator |
|
| WhereQueryOperator |
|
| OrderByQueryOperator |
|
| PartitionQueryOperator |
|
| LetQueryOperator |
|
| GroupByOrGroupJoinQueryOperator |
|
| JoinQueryOperator |
|
. |
|
|
|
FromQueryOperator = |
|
"From" CollectionRangeVariable { "," CollectionRangeVariable } |
|
. |
|
|
|
AggregateQueryOperator = |
|
"Aggregate" CollectionRangeVariable { QueryOperator } "Into" ExpressionRangeVariable { "," ExpressionRangeVariable } |
|
. |
|
|
|
SelectQueryOperator = |
|
"Select" ExpressionRangeVariable { "," ExpressionRangeVariable } |
|
. |
|
|
|
DistinctQueryOperator = |
|
"Distinct" |
|
. |
|
|
|
WhereQueryOperator = |
|
"Where" Expression |
|
. |
|
|
|
OrderByQueryOperator = |
|
"Order" "By" Expression ( "Ascending" | "Descending" ) { "," Expression ( "Ascending" | "Descending" ) } |
|
. |
|
|
|
PartitionQueryOperator = |
|
( "Take" | "Skip" ) [ "While" ] Expression |
|
. |
|
|
|
LetQueryOperator = |
|
"Let" ExpressionRangeVariable { "," ExpressionRangeVariable } |
|
. |
|
|
|
GroupByOrGroupJoinQueryOperator = |
|
"Group" |
|
( |
|
EXPECTEDCONFLICT("Join") |
|
JoinQueryOperator { ( "Group" JoinQueryOperator GroupJoinSuffix | JoinQueryOperator ) } |
|
GroupJoinSuffix |
|
| |
|
( EXPECTEDCONFLICT("By") () | ExpressionRangeVariable { "," ExpressionRangeVariable } ) |
|
"By" ExpressionRangeVariable { "," ExpressionRangeVariable } |
|
"Into" ExpressionRangeVariable { "," ExpressionRangeVariable } |
|
) |
|
. |
|
|
|
JoinQueryOperator = |
|
"Join" CollectionRangeVariable |
|
"On" Expression "Equals" Expression { "," Expression "Equals" Expression } |
|
. |
|
|
|
GroupJoinSuffix = |
|
"Into" ExpressionRangeVariable { "," ExpressionRangeVariable } |
|
. |
|
|
|
ExpressionRangeVariable = |
|
[ |
|
EXPECTEDCONFLICT("Where", "Until", "Unicode", "Text", "Take", "Skip", "Preserve", |
|
"Order", "Off", "Out", "Key", "Join", "Into", "Infer", "Group", "From", |
|
"Explicit", "Equals", "Distinct", "Descending", "Compare", "By", |
|
"Binary", "Auto", "Assembly", "Ascending", "Ansi", "Aggregate", ident) |
|
( |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier |
|
// HACK: needs to be optional because Expression can start with Identifier too |
|
[ (. PopContext(); isAlreadyInExpr = true; .) |
|
( "As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) "=" |
|
| "=" |
|
| (. |
|
currentState = endOfStatementTerminatorAndBlock; /* leave this block */ |
|
InformToken(t); /* process Identifier again*/ |
|
/* for processing current token (la): go to the position after processing End */ |
|
goto switchlbl; |
|
.) |
|
ANY /* never reached due to goto above: */ |
|
/* this ANY is just so that Coco knows this branch isn't empty */ |
|
) |
|
] |
|
) |
|
] |
|
Expression |
|
(. if (!isAlreadyInExpr) PopContext(); isAlreadyInExpr = false; .) |
|
. |
|
|
|
CollectionRangeVariable = |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier (. PopContext(); .) |
|
[ "As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ] |
|
"In" Expression |
|
. |
|
|
|
/* semantic action will be inserted on all paths that possibly lead to XmlLiteral */ |
|
XmlLiteral |
|
(.OnEachPossiblePath: nextTokenIsPotentialStartOfExpression = true; .) |
|
= |
|
(. PushContext(Context.Xml, la, t); .) |
|
( |
|
( XmlComment | XmlProcessingInstruction | XmlCData ) [ XmlContent ] { ( XmlComment | XmlProcessingInstruction ) [ XmlContent ] } [ XmlElement { XmlComment [ XmlContent ] } ] |
|
| |
|
XmlElement { XmlComment [ XmlContent ] } |
|
) |
|
(. PopContext(); .) |
|
. |
|
|
|
XmlElement = |
|
(. PushContext(Context.Xml, la, t); .) |
|
XmlOpenTag { ANY | XmlEmbeddedExpression } ( XmlCloseTagEmptyElement | XmlCloseTag { ANY | XmlEmbeddedExpression | XmlElement } XmlOpenEndTag { ANY | XmlEmbeddedExpression } XmlCloseTag ) |
|
(. PopContext(); .) |
|
. |
|
|
|
XmlEmbeddedExpression = |
|
XmlStartInlineVB Expression XmlEndInlineVB |
|
. |
|
|
|
PrimitiveTypeName = |
|
"Byte" | |
|
"SByte" | |
|
"UShort" | |
|
"Short" | |
|
"UInteger" | |
|
"Integer" | |
|
"ULong" | |
|
"Long" | |
|
"Single" | |
|
"Double" | |
|
"Decimal" | |
|
"Boolean" | |
|
"Date" | |
|
"Char" | |
|
"String" | |
|
"Object" |
|
. |
|
|
|
TypeName = ( "Global" | Identifier | PrimitiveTypeName | "?" /* used for ? = completion */ ) { TypeSuffix } { "." IdentifierOrKeyword { TypeSuffix } } . |
|
|
|
TypeSuffix = "(" (. PushContext(Context.Expression, la, t); .) ( "Of" [ (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ] { "," [ (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ] } | [ ArgumentList ] ) (. PopContext(); .) ")" . |
|
|
|
IdentifierOrKeyword = ident |
|
| "AddHandler" |
|
| "AddressOf" |
|
| "Aggregate" |
|
| "Alias" |
|
| "And" |
|
| "AndAlso" |
|
| "Ansi" |
|
| "As" |
|
| "Ascending" |
|
| "Assembly" |
|
| "Auto" |
|
| "Binary" |
|
| "Boolean" |
|
| "ByRef" |
|
| "By" |
|
| "Byte" |
|
| "ByVal" |
|
| "Call" |
|
| "Case" |
|
| "Catch" |
|
| "CBool" |
|
| "CByte" |
|
| "CChar" |
|
| "CDate" |
|
| "CDbl" |
|
| "CDec" |
|
| "Char" |
|
| "CInt" |
|
| "Class" |
|
| "CLng" |
|
| "CObj" |
|
| "Compare" |
|
| "Const" |
|
| "Continue" |
|
| "CSByte" |
|
| "CShort" |
|
| "CSng" |
|
| "CStr" |
|
| "CType" |
|
| "CUInt" |
|
| "CULng" |
|
| "CUShort" |
|
| "Custom" |
|
| "Date" |
|
| "Decimal" |
|
| "Declare" |
|
| "Default" |
|
| "Delegate" |
|
| "Descending" |
|
| "Dim" |
|
| "DirectCast" |
|
| "Distinct" |
|
| "Do" |
|
| "Double" |
|
| "Each" |
|
| "Else" |
|
| "ElseIf" |
|
| "End" |
|
| "EndIf" |
|
| "Enum" |
|
| "Equals" |
|
| "Erase" |
|
| "Error" |
|
| "Event" |
|
| "Exit" |
|
| "Explicit" |
|
| "False" |
|
| "Finally" |
|
| "For" |
|
| "Friend" |
|
| "From" |
|
| "Function" |
|
| "Get" |
|
| "GetType" |
|
| "Global" |
|
| "GoSub" |
|
| "GoTo" |
|
| "Group" |
|
| "Handles" |
|
| "If" |
|
| "Implements" |
|
| "Imports" |
|
| "In" |
|
| "Infer" |
|
| "Inherits" |
|
| "Integer" |
|
| "Interface" |
|
| "Into" |
|
| "Is" |
|
| "IsNot" |
|
| "Join" |
|
| "Key" |
|
| "Let" |
|
| "Lib" |
|
| "Like" |
|
| "Long" |
|
| "Loop" |
|
| "Me" |
|
| "Mod" |
|
| "Module" |
|
| "MustInherit" |
|
| "MustOverride" |
|
| "MyBase" |
|
| "MyClass" |
|
| "Namespace" |
|
| "Narrowing" |
|
| "New" |
|
| "Next" |
|
| "Not" |
|
| "Nothing" |
|
| "NotInheritable" |
|
| "NotOverridable" |
|
| "Object" |
|
| "Of" |
|
| "Off" |
|
| "On" |
|
| "Operator" |
|
| "Option" |
|
| "Optional" |
|
| "Or" |
|
| "Order" |
|
| "OrElse" |
|
| "Out" |
|
| "Overloads" |
|
| "Overridable" |
|
| "Overrides" |
|
| "ParamArray" |
|
| "Partial" |
|
| "Preserve" |
|
| "Private" |
|
| "Property" |
|
| "Protected" |
|
| "Public" |
|
| "RaiseEvent" |
|
| "ReadOnly" |
|
| "ReDim" |
|
| "Rem" |
|
| "RemoveHandler" |
|
| "Resume" |
|
| "Return" |
|
| "SByte" |
|
| "Select" |
|
| "Set" |
|
| "Shadows" |
|
| "Shared" |
|
| "Short" |
|
| "Single" |
|
| "Skip" |
|
| "Static" |
|
| "Step" |
|
| "Stop" |
|
| "Strict" |
|
| "String" |
|
| "Structure" |
|
| "Sub" |
|
| "SyncLock" |
|
| "Take" |
|
| "Text" |
|
| "Then" |
|
| "Throw" |
|
| "To" |
|
| "True" |
|
| "Try" |
|
| "TryCast" |
|
| "TypeOf" |
|
| "UInteger" |
|
| "ULong" |
|
| "Unicode" |
|
| "Until" |
|
| "UShort" |
|
| "Using" |
|
| "Variant" |
|
| "Wend" |
|
| "When" |
|
| "Where" |
|
| "While" |
|
| "Widening" |
|
| "With" |
|
| "WithEvents" |
|
| "WriteOnly" |
|
| "Xor" |
|
| "GetXmlNamespace" |
|
. |
|
|
|
Literal = |
|
LiteralString | |
|
LiteralCharacter | |
|
LiteralInteger | |
|
LiteralDouble | |
|
LiteralSingle | |
|
LiteralDecimal | |
|
LiteralDate | |
|
"True" | |
|
"False" | |
|
"Nothing" | |
|
/* from InstanceExpression */ |
|
"Me" | |
|
"MyBase" | |
|
"MyClass" |
|
. |
|
|
|
Statement = |
|
VariableDeclarationStatement |
|
| WithOrLockStatement |
|
| AddOrRemoveHandlerStatement |
|
| RaiseEventStatement |
|
| EXPECTEDCONFLICT("If") IfStatement /* prefer if-statement to if-expression */ |
|
| SelectStatement |
|
| WhileStatement |
|
| DoLoopStatement |
|
| ForStatement |
|
| ErrorHandlingStatement |
|
| ThrowStatement |
|
| TryStatement |
|
| BranchStatement |
|
| ReDimStatement |
|
| EraseStatement |
|
| UsingStatement |
|
| InvocationStatement |
|
. |
|
|
|
VariableDeclarationStatement = |
|
( "Dim" | "Static" | "Const" ) |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) |
|
Identifier (. PopContext(); .) [ "?" ] { "(" [ Expression ] { "," [ Expression ] } ")" } |
|
[ "As" (. PushContext(Context.Type, la, t); .) ( NewExpression | TypeName ) (. PopContext(); .) ] |
|
[ "=" Expression ] |
|
{ "," |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) |
|
Identifier (. PopContext(); .) [ "?" ] { "(" [ Expression ] { "," [ Expression ] } ")" } |
|
[ "As" (. PushContext(Context.Type, la, t); .) ( NewExpression | TypeName ) (. PopContext(); .) ] |
|
[ "=" Expression ] |
|
} |
|
. |
|
|
|
WithOrLockStatement = |
|
( "With" | "SyncLock" ) Expression StatementTerminatorAndBlock "End" ( "With" | "SyncLock" ) |
|
. |
|
|
|
AddOrRemoveHandlerStatement = |
|
( "AddHandler" | "RemoveHandler" ) Expression "," Expression |
|
. |
|
|
|
RaiseEventStatement = |
|
"RaiseEvent" IdentifierOrKeyword [ "(" (. PushContext(Context.Expression, la, t); .) [ ArgumentList ] (. PopContext(); .) ")" ] |
|
. |
|
|
|
IfStatement = |
|
"If" Expression |
|
( "Then" |
|
( Statement { EXPECTEDCONFLICT(":") ":" [Statement] } [ EXPECTEDCONFLICT("Else") "Else" [Statement] { EXPECTEDCONFLICT(":") ":" [Statement] } ] |
|
| MultilineIfRemainder |
|
) |
|
| MultilineIfRemainder |
|
) |
|
. |
|
|
|
MultilineIfRemainder = |
|
StatementTerminatorAndBlock |
|
{ |
|
("Else" [ "If" Expression [ "Then" ] ] |
|
| "ElseIf" Expression [ "Then" ] |
|
) |
|
StatementTerminatorAndBlock |
|
} |
|
"End" "If" |
|
. |
|
|
|
SelectStatement = |
|
"Select" [ "Case" ] Expression StatementTerminator |
|
{ |
|
"Case" ( |
|
"Else" | |
|
( [ "Is" ] ComparisonOperator SimpleExpressionWithSuffix | Expression ) |
|
{ "," ( [ "Is" ] ComparisonOperator SimpleExpressionWithSuffix | Expression ) } |
|
) |
|
StatementTerminatorAndBlock |
|
} |
|
"End" "Select" |
|
. |
|
|
|
ComparisonOperator = |
|
"=" | "<>" | "<" | ">" (. wasNormalAttribute = false; .) | ">=" | "<=" |
|
. |
|
|
|
WhileStatement = |
|
"While" Expression StatementTerminatorAndBlock "End" "While" |
|
. |
|
|
|
DoLoopStatement = |
|
"Do" ( DoTopLoopStatement | DoBottomLoopStatement ) |
|
. |
|
|
|
DoTopLoopStatement = |
|
( "While" | "Until" ) Expression |
|
StatementTerminatorAndBlock |
|
"Loop" |
|
. |
|
|
|
DoBottomLoopStatement = |
|
StatementTerminatorAndBlock |
|
"Loop" [ ( "While" | "Until" ) Expression ] |
|
. |
|
|
|
ForStatement = |
|
"For" ( ForLoopStatement | ForEachLoopStatement ) |
|
. |
|
|
|
ForLoopStatement = |
|
ForLoopVariable "=" Expression /* "To" is binary operator */ [ "Step" Expression ] |
|
StatementTerminatorAndBlock |
|
"Next" [ Expression { "," Expression } ] |
|
. |
|
|
|
ForEachLoopStatement = |
|
"Each" ForLoopVariable "In" Expression |
|
StatementTerminatorAndBlock |
|
"Next" [ Expression { "," Expression } ] |
|
. |
|
|
|
ForLoopVariable = |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) SimpleExpression (. PopContext(); .) |
|
[ "?" ] { ExpressionSuffix } |
|
[ "As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ] |
|
. |
|
|
|
ErrorHandlingStatement = |
|
[ "On" ] "Error" ( Expression | "GoTo" ( LiteralInteger | Identifier ) | "Resume" "Next" ) |
|
| "Resume" ( "Next" | LiteralInteger | Identifier ) |
|
. |
|
|
|
ThrowStatement = |
|
"Throw" [ Expression ] |
|
. |
|
|
|
TryStatement = |
|
"Try" |
|
StatementTerminatorAndBlock |
|
{ |
|
"Catch" |
|
[ (. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier (. PopContext(); .) |
|
[ "As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ] |
|
] |
|
[ "When" Expression ] |
|
StatementTerminatorAndBlock |
|
} |
|
[ |
|
"Finally" |
|
StatementTerminatorAndBlock |
|
] |
|
"End" "Try" |
|
. |
|
|
|
BranchStatement = |
|
"GoTo" ( Identifier | LiteralInteger ) |
|
| "Exit" ( "Do" | "For" | "While" | "Select" | "Sub" | "Function" | "Property" | "Try" ) |
|
| "Continue" ( "Do" | "For" | "While" ) |
|
| "Stop" |
|
/*| "End" HACK End-Statements has special handling in Block */ |
|
| "Return" (. PushContext(Context.Expression, la, t); .) [ Expression ] (. PopContext(); .) |
|
. |
|
|
|
ReDimStatement = |
|
"ReDim" |
|
[ EXPECTEDCONFLICT("Preserve") "Preserve" ] /* Preserve is context-dependend keyword */ |
|
Expression |
|
. |
|
|
|
EraseStatement = |
|
"Erase" Expression { "," Expression } |
|
. |
|
|
|
UsingVariable = |
|
[ |
|
EXPECTEDCONFLICT("Where", "Until", "Unicode", "Text", "Take", "Skip", "Preserve", |
|
"Order", "Off", "Out", "Key", "Join", "Into", "Infer", "Group", "From", |
|
"Explicit", "Equals", "Distinct", "Descending", "Compare", "By", |
|
"Binary", "Auto", "Assembly", "Ascending", "Ansi", "Aggregate", ident) |
|
( |
|
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier |
|
// HACK: needs to be optional because Expression can start with Identifier too |
|
[ (. PopContext(); isAlreadyInExpr = true; .) |
|
( "As" [ EXPECTEDCONFLICT("Where", "UShort", "Until", "Unicode", "ULong", "UInteger", "Text", "Take", |
|
"String", "Skip", "Single", "Short", "SByte", "Preserve", "Out", "Order", |
|
"Off", "Object", "Long", "Key", "Join", "Into", "Integer", "Infer", "Group", |
|
"From", "Explicit", "Equals", "Double", "Distinct", "Descending", "Decimal", |
|
"Date", "Compare", "Char", "Byte", "By", "Boolean", "Binary", "Binary", "Auto", |
|
"Assembly", "Ascending", "Ansi", "Aggregate", ident) |
|
(. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) "=" ] |
|
| "=" |
|
| (. |
|
currentState = endOfStatementTerminatorAndBlock; /* leave this block */ |
|
InformToken(t); /* process Identifier again*/ |
|
/* for processing current token (la): go to the position after processing End */ |
|
goto switchlbl; |
|
.) |
|
ANY /* never reached due to goto above: */ |
|
/* this ANY is just so that Coco knows this branch isn't empty */ |
|
) |
|
] |
|
) |
|
] |
|
Expression |
|
(. if (!isAlreadyInExpr) PopContext(); isAlreadyInExpr = false; .) |
|
. |
|
|
|
UsingStatement = |
|
"Using" UsingVariable { "," UsingVariable } |
|
StatementTerminatorAndBlock |
|
"End" "Using" |
|
. |
|
|
|
InvocationStatement = |
|
[ "Call" ] Expression |
|
. |
|
|
|
ArgumentList = |
|
(. activeArgument = 0; .) Expression { "," (. activeArgument++; .) [ Expression ] } |
|
| (. activeArgument = 0; .) "," (. activeArgument++; .) [ Expression ] { "," (. activeArgument++; .) [ Expression ] } |
|
. |
|
|
|
/* This production handles pseudo keywords that are needed in the grammar */ |
|
Identifier = |
|
IdentifierForFieldDeclaration |
|
| "Custom" |
|
. |
|
|
|
IdentifierForFieldDeclaration = |
|
IdentifierForExpressionStart |
|
| "Aggregate" |
|
| "From" |
|
. |
|
|
|
IdentifierForExpressionStart = |
|
IdentifierExceptOut |
|
| "Out" |
|
. |
|
|
|
IdentifierExceptOut = |
|
ident |
|
| "Ansi" |
|
| "Ascending" |
|
| "Assembly" |
|
| "Auto" |
|
| "Binary" |
|
| "By" |
|
| "Compare" |
|
| "Descending" |
|
| "Distinct" |
|
| "Equals" |
|
| "Explicit" |
|
| "Group" |
|
| "Infer" |
|
| "Into" |
|
| "Join" |
|
| "Key" |
|
| "Off" |
|
| "Order" |
|
| "Preserve" |
|
| "Skip" |
|
| "Take" |
|
| "Text" |
|
| "Unicode" |
|
| "Until" |
|
| "Where" |
|
. |
|
|
|
AccessModifier = |
|
"Public" | |
|
"Friend" | |
|
"Protected" | |
|
"Private" |
|
. |
|
|
|
TypeModifier = |
|
AccessModifier | |
|
"MustInherit" | |
|
"NotInheritable" | |
|
"Shadows" | |
|
"Partial" |
|
. |
|
|
|
MemberModifier = |
|
AccessModifier | |
|
"Shadows" | |
|
"Shared" | |
|
"Overridable" | |
|
"NotOverridable" | |
|
"NotInheritable" | |
|
"Overrides" | |
|
"Overloads" | |
|
"Partial" | |
|
"WithEvents" | |
|
"MustOverride" | |
|
"Widening" | |
|
"Narrowing" | |
|
"ReadOnly" | |
|
"WriteOnly" | |
|
"Default" | |
|
"Dim" |
|
. |
|
|
|
ParameterModifier = |
|
"ByVal" | |
|
"ByRef" | |
|
"Optional" | |
|
"ParamArray" |
|
. |
|
|
|
END ExpressionFinder .
|
|
|