.NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform!
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.
 
 
 
 

760 lines
20 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using ICSharpCode.NRefactory.VB.Ast;
using ICSharpCode.NRefactory.VB.Parser;
using ASTAttribute = ICSharpCode.NRefactory.VB.Ast.Attribute;
using Roles = ICSharpCode.NRefactory.VB.AstNode.Roles;
namespace ICSharpCode.NRefactory.VB.Parser {
// ----------------------------------------------------------------------------
// Parser
// ----------------------------------------------------------------------------
//! A Coco/R Parser
partial class VBParser
{
public const int _EOF = 0;
public const int _EOL = 1;
public const int _ident = 2;
public const int _LiteralString = 3;
public const int _LiteralCharacter = 4;
public const int _LiteralInteger = 5;
public const int _LiteralDouble = 6;
public const int _LiteralSingle = 7;
public const int _LiteralDecimal = 8;
public const int _LiteralDate = 9;
public const int _XmlOpenTag = 10;
public const int _XmlCloseTag = 11;
public const int _XmlStartInlineVB = 12;
public const int _XmlEndInlineVB = 13;
public const int _XmlCloseTagEmptyElement = 14;
public const int _XmlOpenEndTag = 15;
public const int _XmlContent = 16;
public const int _XmlComment = 17;
public const int _XmlCData = 18;
public const int _XmlProcessingInstruction = 19;
public const int maxT = 238; //<! max term (w/o pragmas)
const bool T = true;
const bool x = false;
const int minErrDist = 2;
public Errors errors;
void Get () {
lexer.NextToken();
}
bool StartOf (int s) {
return set[s].Get(la.kind);
}
void ExpectWeak (int n, int follow) {
if (la.kind == n) Get();
else {
SynErr(n);
while (!StartOf(follow)) Get();
}
}
bool WeakSeparator(int n, int syFol, int repFol) {
int kind = la.kind;
if (kind == n) {Get(); return true;}
else if (StartOf(repFol)) {return false;}
else {
SynErr(n);
while (!(set[syFol].Get(kind) || set[repFol].Get(kind) || set[0].Get(kind))) {
Get();
kind = la.kind;
}
return StartOf(syFol);
}
}
void VB() {
compilationUnit = new CompilationUnit();
NodeStart(compilationUnit);
Get();
while (la.kind == 1 || la.kind == 21) {
StatementTerminator();
}
while (la.kind == 173) {
OptionStatement(CompilationUnit.MemberRole);
while (la.kind == 1 || la.kind == 21) {
StatementTerminator();
}
}
while (la.kind == 137) {
ImportsStatement(CompilationUnit.MemberRole);
while (la.kind == 1 || la.kind == 21) {
StatementTerminator();
}
}
}
void StatementTerminator() {
while (!(la.kind == 0 || la.kind == 1 || la.kind == 21)) {SynErr(239); Get();}
if (la.kind == 1) {
Get();
AddTerminal(Roles.StatementTerminator);
} else if (la.kind == 21) {
Get();
AddTerminal(Roles.StatementTerminator);
} else SynErr(240);
}
void OptionStatement(Role role) {
var result = new OptionStatement(); NodeStart(result);
Expect(173);
AddTerminal(Roles.Keyword);
if (la.kind == 121) {
Get();
AddTerminal(Ast.OptionStatement.OptionTypeRole);
result.OptionType = OptionType.Explicit;
if (la.kind == 170 || la.kind == 171) {
OnOff(result);
}
} else if (la.kind == 207) {
Get();
AddTerminal(Ast.OptionStatement.OptionTypeRole);
result.OptionType = OptionType.Strict;
if (la.kind == 170 || la.kind == 171) {
OnOff(result);
}
} else if (la.kind == 139) {
Get();
AddTerminal(Ast.OptionStatement.OptionTypeRole);
result.OptionType = OptionType.Infer;
if (la.kind == 170 || la.kind == 171) {
OnOff(result);
}
} else if (la.kind == 87) {
Get();
AddTerminal(Ast.OptionStatement.OptionTypeRole);
result.OptionType = OptionType.Compare;
BinaryText(result);
} else SynErr(241);
StatementTerminator();
NodeEnd(result, role);
}
void ImportsStatement(Role role) {
var result = new ImportsStatement(); NodeStart(result);
Expect(137);
AddTerminal(Roles.Keyword);
ImportsClause();
while (la.kind == 22) {
Get();
ImportsClause();
}
StatementTerminator();
NodeEnd(result, role);
}
void Identifier() {
if (StartOf(1)) {
IdentifierForFieldDeclaration();
} else if (la.kind == 98) {
Get();
} else SynErr(242);
}
void IdentifierForFieldDeclaration() {
switch (la.kind) {
case 2: {
Get();
break;
}
case 58: {
Get();
break;
}
case 62: {
Get();
break;
}
case 64: {
Get();
break;
}
case 65: {
Get();
break;
}
case 66: {
Get();
break;
}
case 67: {
Get();
break;
}
case 70: {
Get();
break;
}
case 87: {
Get();
break;
}
case 104: {
Get();
break;
}
case 107: {
Get();
break;
}
case 116: {
Get();
break;
}
case 121: {
Get();
break;
}
case 126: {
Get();
break;
}
case 133: {
Get();
break;
}
case 139: {
Get();
break;
}
case 143: {
Get();
break;
}
case 146: {
Get();
break;
}
case 147: {
Get();
break;
}
case 170: {
Get();
break;
}
case 176: {
Get();
break;
}
case 178: {
Get();
break;
}
case 184: {
Get();
break;
}
case 203: {
Get();
break;
}
case 212: {
Get();
break;
}
case 213: {
Get();
break;
}
case 223: {
Get();
break;
}
case 224: {
Get();
break;
}
case 230: {
Get();
break;
}
default: SynErr(243); break;
}
}
void TypeName(out AstType type) {
type = null;
if (StartOf(2)) {
PrimitiveTypeName(out type);
} else if (StartOf(3)) {
QualifiedTypeName(out type);
} else SynErr(244);
}
void PrimitiveTypeName(out AstType type) {
type = null;
switch (la.kind) {
case 168: {
Get();
type = new PrimitiveType("Object", t.Location);
break;
}
case 68: {
Get();
type = new PrimitiveType("Boolean", t.Location);
break;
}
case 99: {
Get();
type = new PrimitiveType("Date", t.Location);
break;
}
case 82: {
Get();
type = new PrimitiveType("Char", t.Location);
break;
}
case 208: {
Get();
type = new PrimitiveType("String", t.Location);
break;
}
case 100: {
Get();
type = new PrimitiveType("Decimal", t.Location);
break;
}
case 71: {
Get();
type = new PrimitiveType("Byte", t.Location);
break;
}
case 201: {
Get();
type = new PrimitiveType("Short", t.Location);
break;
}
case 141: {
Get();
type = new PrimitiveType("Integer", t.Location);
break;
}
case 151: {
Get();
type = new PrimitiveType("Long", t.Location);
break;
}
case 202: {
Get();
type = new PrimitiveType("Single", t.Location);
break;
}
case 109: {
Get();
type = new PrimitiveType("Double", t.Location);
break;
}
case 221: {
Get();
type = new PrimitiveType("UInteger", t.Location);
break;
}
case 222: {
Get();
type = new PrimitiveType("ULong", t.Location);
break;
}
case 225: {
Get();
type = new PrimitiveType("UShort", t.Location);
break;
}
case 196: {
Get();
type = new PrimitiveType("SByte", t.Location);
break;
}
default: SynErr(245); break;
}
}
void QualifiedTypeName(out AstType type) {
if (la.kind == 130) {
Get();
} else if (StartOf(4)) {
Identifier();
} else SynErr(246);
type = new SimpleType(t.val, t.Location);
while (la.kind == 26) {
Get();
Identifier();
type = new QualifiedType(type, new Identifier (t.val, t.Location));
}
}
void OnOff(OptionStatement os) {
if (la.kind == 171) {
Get();
AddTerminal(Ast.OptionStatement.OptionValueRole);
os.OptionValue = OptionValue.On;
} else if (la.kind == 170) {
Get();
AddTerminal(Ast.OptionStatement.OptionValueRole);
os.OptionValue = OptionValue.Off;
} else SynErr(247);
}
void BinaryText(OptionStatement os) {
if (la.kind == 213) {
Get();
AddTerminal(Ast.OptionStatement.OptionValueRole);
os.OptionValue = OptionValue.Text;
} else if (la.kind == 67) {
Get();
AddTerminal(Ast.OptionStatement.OptionValueRole);
os.OptionValue = OptionValue.Binary;
} else SynErr(248);
}
void ImportsClause() {
if (IsAliasImportsClause()) {
AliasImportsClause(Ast.ImportsStatement.ImportsClauseRole);
} else if (StartOf(5)) {
MemberImportsClause(Ast.ImportsStatement.ImportsClauseRole);
} else if (la.kind == 10) {
XmlNamespaceImportsClause(Ast.ImportsStatement.ImportsClauseRole);
} else SynErr(249);
while (!(StartOf(6))) {SynErr(250); Get();}
}
void AliasImportsClause(Role role) {
var result = new AliasImportsClause(); NodeStart(result);
AstType alias;
Identifier();
result.Name = new Identifier (t.val, t.Location);
Expect(20);
TypeName(out alias);
result.Alias = alias;
NodeEnd(result, role);
}
void MemberImportsClause(Role role) {
var result = new MemberImportsClause(); NodeStart(result);
AstType member;
TypeName(out member);
result.Member = member;
NodeEnd(result, role);
}
void XmlNamespaceImportsClause(Role role) {
var result = new XmlNamespaceImportsClause(); NodeStart(result);
Expect(10);
AddTerminal(Roles.XmlOpenTag);
Identifier();
Expect(20);
AddTerminal(Roles.Assign);
Expect(3);
Expect(11);
AddTerminal(Roles.XmlCloseTag);
NodeEnd(result, role);
}
public void ParseRoot() {
VB();
Expect(0); // expect end-of-file automatically added
}
static readonly BitArray[] set = {
new BitArray(new int[] {6291459, 0, 0, 0, 0, 0, 0, 0}),
new BitArray(new int[] {4, 1140850688, 8388687, 1108347136, 821280, 17105920, -2144335872, 65}),
new BitArray(new int[] {0, 0, 262288, 8216, 8396800, 256, 1610679824, 2}),
new BitArray(new int[] {4, 1140850688, 8388687, 1108347140, 821284, 17105920, -2144335872, 65}),
new BitArray(new int[] {4, 1140850688, 8388687, 1108347140, 821280, 17105920, -2144335872, 65}),
new BitArray(new int[] {4, 1140850688, 8650975, 1108355356, 9218084, 17106176, -533656048, 67}),
new BitArray(new int[] {6291459, 0, 0, 0, 0, 0, 0, 0})
};
void SynErr(int line, int col, int errorNumber)
{
this.Errors.Error(line, col, GetMessage(errorNumber));
}
string GetMessage(int errorNumber)
{
switch (errorNumber) {
case 0: return "EOF expected";
case 1: return "EOL expected";
case 2: return "ident expected";
case 3: return "LiteralString expected";
case 4: return "LiteralCharacter expected";
case 5: return "LiteralInteger expected";
case 6: return "LiteralDouble expected";
case 7: return "LiteralSingle expected";
case 8: return "LiteralDecimal expected";
case 9: return "LiteralDate expected";
case 10: return "XmlOpenTag expected";
case 11: return "XmlCloseTag expected";
case 12: return "XmlStartInlineVB expected";
case 13: return "XmlEndInlineVB expected";
case 14: return "XmlCloseTagEmptyElement expected";
case 15: return "XmlOpenEndTag expected";
case 16: return "XmlContent expected";
case 17: return "XmlComment expected";
case 18: return "XmlCData expected";
case 19: return "XmlProcessingInstruction expected";
case 20: return "\"=\" expected";
case 21: return "\":\" expected";
case 22: return "\",\" expected";
case 23: return "\"&\" expected";
case 24: return "\"/\" expected";
case 25: return "\"\\\\\" expected";
case 26: return "\".\" expected";
case 27: return "\"...\" expected";
case 28: return "\".@\" expected";
case 29: return "\"!\" expected";
case 30: return "\"-\" expected";
case 31: return "\"+\" expected";
case 32: return "\"^\" expected";
case 33: return "\"?\" expected";
case 34: return "\"*\" expected";
case 35: return "\"{\" expected";
case 36: return "\"}\" expected";
case 37: return "\"(\" expected";
case 38: return "\")\" expected";
case 39: return "\">\" expected";
case 40: return "\"<\" expected";
case 41: return "\"<>\" expected";
case 42: return "\">=\" expected";
case 43: return "\"<=\" expected";
case 44: return "\"<<\" expected";
case 45: return "\">>\" expected";
case 46: return "\"+=\" expected";
case 47: return "\"^=\" expected";
case 48: return "\"-=\" expected";
case 49: return "\"*=\" expected";
case 50: return "\"/=\" expected";
case 51: return "\"\\\\=\" expected";
case 52: return "\"<<=\" expected";
case 53: return "\">>=\" expected";
case 54: return "\"&=\" expected";
case 55: return "\":=\" expected";
case 56: return "\"AddHandler\" expected";
case 57: return "\"AddressOf\" expected";
case 58: return "\"Aggregate\" expected";
case 59: return "\"Alias\" expected";
case 60: return "\"And\" expected";
case 61: return "\"AndAlso\" expected";
case 62: return "\"Ansi\" expected";
case 63: return "\"As\" expected";
case 64: return "\"Ascending\" expected";
case 65: return "\"Assembly\" expected";
case 66: return "\"Auto\" expected";
case 67: return "\"Binary\" expected";
case 68: return "\"Boolean\" expected";
case 69: return "\"ByRef\" expected";
case 70: return "\"By\" expected";
case 71: return "\"Byte\" expected";
case 72: return "\"ByVal\" expected";
case 73: return "\"Call\" expected";
case 74: return "\"Case\" expected";
case 75: return "\"Catch\" expected";
case 76: return "\"CBool\" expected";
case 77: return "\"CByte\" expected";
case 78: return "\"CChar\" expected";
case 79: return "\"CDate\" expected";
case 80: return "\"CDbl\" expected";
case 81: return "\"CDec\" expected";
case 82: return "\"Char\" expected";
case 83: return "\"CInt\" expected";
case 84: return "\"Class\" expected";
case 85: return "\"CLng\" expected";
case 86: return "\"CObj\" expected";
case 87: return "\"Compare\" expected";
case 88: return "\"Const\" expected";
case 89: return "\"Continue\" expected";
case 90: return "\"CSByte\" expected";
case 91: return "\"CShort\" expected";
case 92: return "\"CSng\" expected";
case 93: return "\"CStr\" expected";
case 94: return "\"CType\" expected";
case 95: return "\"CUInt\" expected";
case 96: return "\"CULng\" expected";
case 97: return "\"CUShort\" expected";
case 98: return "\"Custom\" expected";
case 99: return "\"Date\" expected";
case 100: return "\"Decimal\" expected";
case 101: return "\"Declare\" expected";
case 102: return "\"Default\" expected";
case 103: return "\"Delegate\" expected";
case 104: return "\"Descending\" expected";
case 105: return "\"Dim\" expected";
case 106: return "\"DirectCast\" expected";
case 107: return "\"Distinct\" expected";
case 108: return "\"Do\" expected";
case 109: return "\"Double\" expected";
case 110: return "\"Each\" expected";
case 111: return "\"Else\" expected";
case 112: return "\"ElseIf\" expected";
case 113: return "\"End\" expected";
case 114: return "\"EndIf\" expected";
case 115: return "\"Enum\" expected";
case 116: return "\"Equals\" expected";
case 117: return "\"Erase\" expected";
case 118: return "\"Error\" expected";
case 119: return "\"Event\" expected";
case 120: return "\"Exit\" expected";
case 121: return "\"Explicit\" expected";
case 122: return "\"False\" expected";
case 123: return "\"Finally\" expected";
case 124: return "\"For\" expected";
case 125: return "\"Friend\" expected";
case 126: return "\"From\" expected";
case 127: return "\"Function\" expected";
case 128: return "\"Get\" expected";
case 129: return "\"GetType\" expected";
case 130: return "\"Global\" expected";
case 131: return "\"GoSub\" expected";
case 132: return "\"GoTo\" expected";
case 133: return "\"Group\" expected";
case 134: return "\"Handles\" expected";
case 135: return "\"If\" expected";
case 136: return "\"Implements\" expected";
case 137: return "\"Imports\" expected";
case 138: return "\"In\" expected";
case 139: return "\"Infer\" expected";
case 140: return "\"Inherits\" expected";
case 141: return "\"Integer\" expected";
case 142: return "\"Interface\" expected";
case 143: return "\"Into\" expected";
case 144: return "\"Is\" expected";
case 145: return "\"IsNot\" expected";
case 146: return "\"Join\" expected";
case 147: return "\"Key\" expected";
case 148: return "\"Let\" expected";
case 149: return "\"Lib\" expected";
case 150: return "\"Like\" expected";
case 151: return "\"Long\" expected";
case 152: return "\"Loop\" expected";
case 153: return "\"Me\" expected";
case 154: return "\"Mod\" expected";
case 155: return "\"Module\" expected";
case 156: return "\"MustInherit\" expected";
case 157: return "\"MustOverride\" expected";
case 158: return "\"MyBase\" expected";
case 159: return "\"MyClass\" expected";
case 160: return "\"Namespace\" expected";
case 161: return "\"Narrowing\" expected";
case 162: return "\"New\" expected";
case 163: return "\"Next\" expected";
case 164: return "\"Not\" expected";
case 165: return "\"Nothing\" expected";
case 166: return "\"NotInheritable\" expected";
case 167: return "\"NotOverridable\" expected";
case 168: return "\"Object\" expected";
case 169: return "\"Of\" expected";
case 170: return "\"Off\" expected";
case 171: return "\"On\" expected";
case 172: return "\"Operator\" expected";
case 173: return "\"Option\" expected";
case 174: return "\"Optional\" expected";
case 175: return "\"Or\" expected";
case 176: return "\"Order\" expected";
case 177: return "\"OrElse\" expected";
case 178: return "\"Out\" expected";
case 179: return "\"Overloads\" expected";
case 180: return "\"Overridable\" expected";
case 181: return "\"Overrides\" expected";
case 182: return "\"ParamArray\" expected";
case 183: return "\"Partial\" expected";
case 184: return "\"Preserve\" expected";
case 185: return "\"Private\" expected";
case 186: return "\"Property\" expected";
case 187: return "\"Protected\" expected";
case 188: return "\"Public\" expected";
case 189: return "\"RaiseEvent\" expected";
case 190: return "\"ReadOnly\" expected";
case 191: return "\"ReDim\" expected";
case 192: return "\"Rem\" expected";
case 193: return "\"RemoveHandler\" expected";
case 194: return "\"Resume\" expected";
case 195: return "\"Return\" expected";
case 196: return "\"SByte\" expected";
case 197: return "\"Select\" expected";
case 198: return "\"Set\" expected";
case 199: return "\"Shadows\" expected";
case 200: return "\"Shared\" expected";
case 201: return "\"Short\" expected";
case 202: return "\"Single\" expected";
case 203: return "\"Skip\" expected";
case 204: return "\"Static\" expected";
case 205: return "\"Step\" expected";
case 206: return "\"Stop\" expected";
case 207: return "\"Strict\" expected";
case 208: return "\"String\" expected";
case 209: return "\"Structure\" expected";
case 210: return "\"Sub\" expected";
case 211: return "\"SyncLock\" expected";
case 212: return "\"Take\" expected";
case 213: return "\"Text\" expected";
case 214: return "\"Then\" expected";
case 215: return "\"Throw\" expected";
case 216: return "\"To\" expected";
case 217: return "\"True\" expected";
case 218: return "\"Try\" expected";
case 219: return "\"TryCast\" expected";
case 220: return "\"TypeOf\" expected";
case 221: return "\"UInteger\" expected";
case 222: return "\"ULong\" expected";
case 223: return "\"Unicode\" expected";
case 224: return "\"Until\" expected";
case 225: return "\"UShort\" expected";
case 226: return "\"Using\" expected";
case 227: return "\"Variant\" expected";
case 228: return "\"Wend\" expected";
case 229: return "\"When\" expected";
case 230: return "\"Where\" expected";
case 231: return "\"While\" expected";
case 232: return "\"Widening\" expected";
case 233: return "\"With\" expected";
case 234: return "\"WithEvents\" expected";
case 235: return "\"WriteOnly\" expected";
case 236: return "\"Xor\" expected";
case 237: return "\"GetXmlNamespace\" expected";
case 238: return "??? expected";
case 239: return "this symbol not expected in StatementTerminator";
case 240: return "invalid StatementTerminator";
case 241: return "invalid OptionStatement";
case 242: return "invalid Identifier";
case 243: return "invalid IdentifierForFieldDeclaration";
case 244: return "invalid TypeName";
case 245: return "invalid PrimitiveTypeName";
case 246: return "invalid QualifiedTypeName";
case 247: return "invalid OnOff";
case 248: return "invalid BinaryText";
case 249: return "invalid ImportsClause";
case 250: return "this symbol not expected in ImportsClause";
default: return "error " + errorNumber;
}
}
} // end Parser
} // end namespace