Browse Source

added experimental parser for VB .NET expression finder

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@5798 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
8b0e9bb861
  1. 18
      src/Libraries/NRefactory/NRefactory.sln
  2. 11
      src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs
  3. 19
      src/Libraries/NRefactory/Project/NRefactory.csproj
  4. 3
      src/Libraries/NRefactory/Project/Src/Ast/Enums.cs
  5. 92
      src/Libraries/NRefactory/Project/Src/Ast/Generated.cs
  6. 2
      src/Libraries/NRefactory/Project/Src/IAstVisitor.cs
  7. 2
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Tokens.cs
  8. 1171
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
  9. 9
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
  10. 780
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Parser.cs
  11. 161
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Parser.frame
  12. 390
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ParserHelper.atg
  13. 48
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ParserHelper.cs
  14. 363
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Scanner.frame
  15. 50
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/Program.cs
  16. 31
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/Properties/AssemblyInfo.cs
  17. 61
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/VBParserExperiment.csproj
  18. 2004
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs
  19. 89
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG
  20. 5
      src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs
  21. 6
      src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs
  22. 9
      src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs
  23. 11
      src/Libraries/NRefactory/Project/Src/Visitors/NodeTrackingAstVisitor.cs
  24. 4
      src/Libraries/NRefactory/Project/Src/Visitors/NotImplementedAstVisitor.cs

18
src/Libraries/NRefactory/NRefactory.sln

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
# SharpDevelop 4.0.0.5490
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
# SharpDevelop 4.0.0.5705
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryTests", "Test\NRefactoryTests.csproj", "{870115DD-960A-4406-A6B9-600BCDC36A03}"
@ -10,10 +10,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryASTGenerator", "N @@ -10,10 +10,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryASTGenerator", "N
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryDemo", "..\..\..\samples\NRefactoryDemo\NRefactoryDemo.csproj", "{63199047-9D5D-474C-B3CC-62ABBB071B67}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VBParserExperiment", "Project\Src\Parser\VBNet\Experimental\Test\VBParserExperiment.csproj", "{A21BF46E-27BC-4DCA-AB11-462BE5B0B028}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
@ -32,6 +36,14 @@ Global @@ -32,6 +36,14 @@ Global
{63199047-9D5D-474C-B3CC-62ABBB071B67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{63199047-9D5D-474C-B3CC-62ABBB071B67}.Release|Any CPU.Build.0 = Release|Any CPU
{63199047-9D5D-474C-B3CC-62ABBB071B67}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A21BF46E-27BC-4DCA-AB11-462BE5B0B028}.Debug|Any CPU.Build.0 = Debug|x86
{A21BF46E-27BC-4DCA-AB11-462BE5B0B028}.Debug|Any CPU.ActiveCfg = Debug|x86
{A21BF46E-27BC-4DCA-AB11-462BE5B0B028}.Debug|x86.Build.0 = Debug|x86
{A21BF46E-27BC-4DCA-AB11-462BE5B0B028}.Debug|x86.ActiveCfg = Debug|x86
{A21BF46E-27BC-4DCA-AB11-462BE5B0B028}.Release|Any CPU.Build.0 = Release|x86
{A21BF46E-27BC-4DCA-AB11-462BE5B0B028}.Release|Any CPU.ActiveCfg = Release|x86
{A21BF46E-27BC-4DCA-AB11-462BE5B0B028}.Release|x86.Build.0 = Release|x86
{A21BF46E-27BC-4DCA-AB11-462BE5B0B028}.Release|x86.ActiveCfg = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

11
src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs

@ -40,6 +40,15 @@ namespace NRefactoryASTGenerator.Ast @@ -40,6 +40,15 @@ namespace NRefactoryASTGenerator.Ast
public NamedArgumentExpression(string name, Expression expression) {}
}
class MemberInitializerExpression : Expression {
string name;
bool isKey;
Expression expression;
public MemberInitializerExpression() { }
public MemberInitializerExpression(string name, Expression expression) {}
}
[IncludeBoolProperty("IsAnonymousType", "return createType.IsNull || string.IsNullOrEmpty(createType.Type);")]
class ObjectCreateExpression : Expression {
TypeReference createType;
@ -379,4 +388,6 @@ namespace NRefactoryASTGenerator.Ast @@ -379,4 +388,6 @@ namespace NRefactoryASTGenerator.Ast
QueryExpressionJoinVBClause joinClause;
List<ExpressionRangeVariable> intoVariables;
}
}

19
src/Libraries/NRefactory/Project/NRefactory.csproj

@ -55,6 +55,9 @@ @@ -55,6 +55,9 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Src\Parser\VBNet\Experimental\Parser.cs">
<DependentUpon>ParserHelper.atg</DependentUpon>
</Compile>
<None Include="Resources\ICSharpCode.NRefactory.snk" />
<None Include="Src\Lexer\BuildKeywords.pl" />
<Compile Include="Configuration\AssemblyInfo.cs" />
@ -84,6 +87,7 @@ @@ -84,6 +87,7 @@
<Compile Include="Src\OperatorPrecedence.cs" />
<Compile Include="Src\Parser\CSharp\CSharpParser.cs" />
<Compile Include="Src\Parser\CSharp\Parser.cs" />
<Compile Include="Src\Parser\VBNet\Experimental\ParserHelper.cs" />
<Compile Include="Src\Parser\VBNet\Parser.cs" />
<Compile Include="Src\Parser\VBNet\VBNetParser.cs" />
<Compile Include="Src\Parser\AbstractParser.cs" />
@ -134,6 +138,15 @@ @@ -134,6 +138,15 @@
<Compile Include="Src\Ast\TypeReference.cs" />
<Compile Include="Src\Parser\VBNet\ParamModifierList.cs" />
<Compile Include="Src\Visitors\NodeTrackingAstVisitor.cs" />
<None Include="Src\Parser\VBNet\Experimental\Parser.frame">
<DependentUpon>ParserHelper.atg</DependentUpon>
</None>
<None Include="Src\Parser\VBNet\Experimental\ParserHelper.atg">
<Generator>CocoParserGenerator</Generator>
</None>
<None Include="Src\Parser\VBNet\Experimental\Scanner.frame">
<DependentUpon>ParserHelper.atg</DependentUpon>
</None>
</ItemGroup>
<ItemGroup>
<Content Include="Src\Lexer\CSharp\KeywordList.txt" />
@ -147,8 +160,12 @@ @@ -147,8 +160,12 @@
<Content Include="Src\Parser\Frames\SharpCoco.exe" />
<Content Include="Src\Parser\Frames\trace.txt" />
<Folder Include="Src\Parser\VBNet" />
<Content Include="Src\Parser\VBNet\VBNET.ATG" />
<Content Include="Src\Parser\VBNet\VBNET.ATG">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
<Generator>CocoParserGenerator</Generator>
</Content>
<Content Include="Src\Parser\gen.bat" />
<Folder Include="Src\Parser\VBNet\Experimental" />
<Folder Include="Src\PrettyPrinter" />
<Folder Include="Src\PrettyPrinter\CSharp" />
<Folder Include="Src\PrettyPrinter\VBNet" />

3
src/Libraries/NRefactory/Project/Src/Ast/Enums.cs

@ -20,7 +20,6 @@ namespace ICSharpCode.NRefactory.Ast @@ -20,7 +20,6 @@ namespace ICSharpCode.NRefactory.Ast
Internal = 0x0002,
Protected = 0x0004,
Public = 0x0008,
Dim = 0x0010, // VB.NET SPECIFIC, for fields/local variables only
// Scope
Abstract = 0x0010, // == MustOverride/MustInherit
@ -45,6 +44,8 @@ namespace ICSharpCode.NRefactory.Ast @@ -45,6 +44,8 @@ namespace ICSharpCode.NRefactory.Ast
Default = 0x40000, // VB specific
Fixed = 0x80000, // C# specific (fixed size arrays in unsafe structs)
Dim = 0x100000, // VB.NET SPECIFIC, for fields/local variables only
/// <summary>Generated code, not part of parsed code</summary>
Synthetic = 0x200000,
/// <summary>Only for VB properties.</summary>

92
src/Libraries/NRefactory/Project/Src/Ast/Generated.cs

@ -2689,6 +2689,61 @@ public Location ExtendedEndLocation { get; set; } @@ -2689,6 +2689,61 @@ public Location ExtendedEndLocation { get; set; }
}
}
public class MemberInitializerExpression : Expression {
string name;
bool isKey;
Expression expression;
public string Name {
get {
return name;
}
set {
name = value ?? "";
}
}
public bool IsKey {
get {
return isKey;
}
set {
isKey = value;
}
}
public Expression Expression {
get {
return expression;
}
set {
expression = value ?? Expression.Null;
if (!expression.IsNull) expression.Parent = this;
}
}
public MemberInitializerExpression() {
name = "";
expression = Expression.Null;
}
public MemberInitializerExpression(string name, Expression expression) {
Name = name;
Expression = expression;
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return visitor.VisitMemberInitializerExpression(this, data);
}
public override string ToString() {
return string.Format("[MemberInitializerExpression Name={0} IsKey={1} Expression={2}]", Name, IsKey, Expression);
}
}
public abstract class MemberNode : ParametrizedNode {
List<InterfaceImplementation> interfaceImplementations;
@ -5362,43 +5417,6 @@ public UsingDeclaration(string @namespace, TypeReference alias) { usings = new L @@ -5362,43 +5417,6 @@ public UsingDeclaration(string @namespace, TypeReference alias) { usings = new L
}
}
public abstract class XmlLiteralExpression : AbstractNode, INullable {
protected XmlLiteralExpression() {
}
public virtual bool IsNull {
get {
return false;
}
}
public static XmlLiteralExpression Null {
get {
return NullXmlLiteralExpression.Instance;
}
}
}
internal sealed class NullXmlLiteralExpression : XmlLiteralExpression {
internal static NullXmlLiteralExpression Instance = new NullXmlLiteralExpression();
public override bool IsNull {
get {
return true;
}
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return null;
}
public override string ToString() {
return "[NullXmlLiteralExpression]";
}
}
public class YieldStatement : Statement {
Statement statement;

2
src/Libraries/NRefactory/Project/Src/IAstVisitor.cs

@ -135,6 +135,8 @@ namespace ICSharpCode.NRefactory { @@ -135,6 +135,8 @@ namespace ICSharpCode.NRefactory {
object VisitLockStatement(LockStatement lockStatement, object data);
object VisitMemberInitializerExpression(MemberInitializerExpression memberInitializerExpression, object data);
object VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression, object data);
object VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data);

2
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Tokens.cs

@ -246,6 +246,8 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -246,6 +246,8 @@ namespace ICSharpCode.NRefactory.Parser.VB
public static BitArray Null = NewSet(Nothing);
public static BitArray BlockSucc = NewSet(Case, Catch, Else, ElseIf, End, Finally, Loop, Next);
public static BitArray IdentifierTokens = NewSet(Text, Binary, Compare, Assembly, Ansi, Auto, Preserve, Unicode, Until, Off, Explicit, Infer, From, Join, Equals, Distinct, Where, Take, Skip, Order, By, Ascending, Descending, Group, Into, Aggregate);
public static BitArray TypeLevel = NewSet(Public, Friend, Class, Interface, Structure, Enum, Delegate, Shared, Partial, Protected, Private, Public, Const, Event, Explicit, New, Operator);
public static BitArray GlobalLevel = NewSet(Namespace, Imports, Public, Friend, Class, Interface, Structure, Enum, Delegate, Partial);
static string[] tokenList = new string[] {
// ----- terminal classes -----

1171
src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs

File diff suppressed because it is too large Load Diff

9
src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG

@ -1458,13 +1458,14 @@ ObjectPropertyInitializerOrVariableInitializer<out Expression expr> @@ -1458,13 +1458,14 @@ ObjectPropertyInitializerOrVariableInitializer<out Expression expr>
=
( IF (IdentAndAsgn())
Identifier
(. NamedArgumentExpression nae = new NamedArgumentExpression(t.val, null);
nae.StartLocation = t.Location;
(. MemberInitializerExpression mie = new MemberInitializerExpression(t.val, null);
mie.StartLocation = t.Location;
mie.IsKey = true;
Expression r = null; .)
"="
( CollectionOrObjectInitializer<out r>
| VariableInitializer <out r> )
(. nae.Expression = r; nae.EndLocation = t.EndLocation; expr = nae; .)
| VariableInitializer<out r> )
(. mie.Expression = r; mie.EndLocation = t.EndLocation; expr = mie; .)
| VariableInitializer <out expr>
)

780
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Parser.cs

@ -0,0 +1,780 @@ @@ -0,0 +1,780 @@
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.NRefactory.Parser.VB;
using ASTAttribute = ICSharpCode.NRefactory.Ast.Attribute;
using ICSharpCode.NRefactory.Parser.VBNet.Experimental;
using System;
namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental {
public partial class Parser {
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 maxT = 222;
const bool T = true;
const bool x = false;
const int minErrDist = 2;
public ILexer lexer;
public Errors errors;
public Parser(ILexer lexer)
{
this.lexer = lexer;
this.errors = new Errors();
}
public Token t; // last recognized token
public Token la; // lookahead token
int errDist = minErrDist;
void SynErr (int n) {
if (errDist >= minErrDist) errors.SynErr(la.line, la.col, n);
errDist = 0;
}
public void SemErr (string msg) {
if (errDist >= minErrDist) errors.SemErr(t.line, t.col, msg);
errDist = 0;
}
void Get () {
for (;;) {
t = la;
la = lexer.NextToken();
if (la.kind <= maxT) { ++errDist; break; }
la = t;
}
}
void Expect (int n) {
if (la.kind==n) Get(); else { SynErr(n); }
}
bool StartOf (int s) {
return set[s, 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, kind] || set[repFol, kind] || set[0, kind])) {
Get();
kind = la.kind;
}
return StartOf(syFol);
}
}
void ParserHelper() {
while (la.kind == 159) {
OptionStatement();
}
while (la.kind == 124) {
ImportsStatement();
}
while (la.kind == 1 || la.kind == 28) {
AttributeBlock();
}
while (StartOf(1)) {
NamespaceMemberDeclaration();
}
}
void OptionStatement() {
Expect(159);
while (StartOf(2)) {
Get();
}
StatementTerminator();
}
void ImportsStatement() {
Expect(124);
while (StartOf(2)) {
Get();
}
StatementTerminator();
}
void AttributeBlock() {
Attribute();
while (la.kind == 1 || la.kind == 28) {
Attribute();
}
StatementTerminator();
}
void NamespaceMemberDeclaration() {
if (la.kind == 146) {
NamespaceDeclaration();
} else if (StartOf(3)) {
TypeDeclaration();
} else SynErr(223);
}
void StatementTerminator() {
if (la.kind == 1) {
Get();
} else if (la.kind == 11) {
Get();
} else SynErr(224);
}
void Attribute() {
if (la.kind == 1) {
Get();
}
Expect(28);
while (StartOf(4)) {
Get();
}
Expect(27);
if (la.kind == 1) {
Get();
}
}
void NamespaceDeclaration() {
Expect(146);
while (StartOf(2)) {
Get();
}
StatementTerminator();
while (StartOf(1)) {
NamespaceMemberDeclaration();
}
Expect(100);
Expect(146);
StatementTerminator();
}
void TypeDeclaration() {
while (la.kind == 1 || la.kind == 28) {
AttributeBlock();
}
while (StartOf(5)) {
TypeModifier();
}
Expect(141);
while (StartOf(2)) {
Get();
}
StatementTerminator();
PushContext(Context.Type);
while (StartOf(6)) {
ModuleMemberDeclaration();
}
Expect(100);
Expect(141);
StatementTerminator();
PopContext();
}
void TypeModifier() {
if (StartOf(7)) {
AccessModifier();
} else if (la.kind == 184) {
Get();
} else SynErr(225);
}
void ModuleMemberDeclaration() {
PushContext(Context.Member);
SubOrFunctionDeclaration();
PopContext();
}
void SubOrFunctionDeclaration() {
while (la.kind == 1 || la.kind == 28) {
AttributeBlock();
}
while (StartOf(8)) {
MemberModifier();
}
if (la.kind == 195) {
Get();
} else if (la.kind == 114) {
Get();
} else SynErr(226);
PushContext(Context.IdentifierExpected);
Get();
PopContext();
if (la.kind == 25) {
Get();
if (StartOf(9)) {
ParameterList();
}
Expect(26);
}
Expect(1);
if (la.kind == 1) {
Block();
}
Expect(100);
if (la.kind == 195) {
Get();
} else if (la.kind == 114) {
Get();
} else SynErr(227);
StatementTerminator();
}
void MemberModifier() {
switch (la.kind) {
case 112: case 170: case 172: case 173: {
AccessModifier();
break;
}
case 184: {
Get();
break;
}
case 185: {
Get();
break;
}
case 165: {
Get();
break;
}
case 153: {
Get();
break;
}
case 166: {
Get();
break;
}
case 164: {
Get();
break;
}
case 168: {
Get();
break;
}
default: SynErr(228); break;
}
}
void ParameterList() {
Parameter();
while (la.kind == 12) {
Get();
Parameter();
}
}
void Block() {
Expect(1);
}
void Parameter() {
while (la.kind == 1 || la.kind == 28) {
AttributeBlock();
}
while (StartOf(10)) {
ParameterModifier();
}
Identifier();
if (la.kind == 50) {
Get();
Get();
}
if (la.kind == 10) {
Get();
while (StartOf(11)) {
Get();
}
}
}
void ParameterModifier() {
if (la.kind == 59) {
Get();
} else if (la.kind == 56) {
Get();
} else if (la.kind == 160) {
Get();
} else if (la.kind == 167) {
Get();
} else SynErr(229);
}
void Identifier() {
PushContext(Context.IdentifierExpected);
if (StartOf(12)) {
IdentifierForFieldDeclaration();
} else if (la.kind == 85) {
Get();
} else SynErr(230);
PopContext();
}
void IdentifierForFieldDeclaration() {
switch (la.kind) {
case 2: {
Get();
break;
}
case 45: {
Get();
break;
}
case 49: {
Get();
break;
}
case 51: {
Get();
break;
}
case 52: {
Get();
break;
}
case 53: {
Get();
break;
}
case 54: {
Get();
break;
}
case 57: {
Get();
break;
}
case 74: {
Get();
break;
}
case 91: {
Get();
break;
}
case 94: {
Get();
break;
}
case 103: {
Get();
break;
}
case 108: {
Get();
break;
}
case 113: {
Get();
break;
}
case 120: {
Get();
break;
}
case 126: {
Get();
break;
}
case 130: {
Get();
break;
}
case 133: {
Get();
break;
}
case 156: {
Get();
break;
}
case 162: {
Get();
break;
}
case 169: {
Get();
break;
}
case 188: {
Get();
break;
}
case 197: {
Get();
break;
}
case 198: {
Get();
break;
}
case 208: {
Get();
break;
}
case 209: {
Get();
break;
}
case 215: {
Get();
break;
}
default: SynErr(231); break;
}
}
void AccessModifier() {
if (la.kind == 173) {
Get();
} else if (la.kind == 112) {
Get();
} else if (la.kind == 172) {
Get();
if (la.kind == 112) {
Get();
}
} else if (la.kind == 170) {
Get();
} else SynErr(232);
}
public void Parse() {
PushContext(Context.Global);
la = new Token(1, 1, 1);
Get();
ParserHelper();
Expect(0);
PopContext();
}
static readonly bool[,] set = {
{T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x},
{x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x,x,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,T,x, T,T,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x},
{x,x,T,T, T,T,T,T, T,T,T,x, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,x},
{x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,T,x, T,T,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x},
{x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,x, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,x},
{x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,T,x, T,T,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x},
{x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x,x, x,x,x,x, T,T,T,x, T,x,T,x, T,T,x,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,x,x, x,x,x,T, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x},
{x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,T,x, T,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x},
{x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x,x, x,x,x,x, T,T,T,x, T,x,T,x, T,T,x,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x},
{x,T,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x,T,x,T, T,T,T,x, T,T,x,T, x,x,x,x, x,x,x,x, x,x,x,x, x,x,T,x, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x,T, x,x,T,x, x,x,x,x, x,x,x,T, x,x,x,x, T,x,x,x, x,T,x,x, x,x,x,x, T,x,x,x, x,x,T,x, x,x,T,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, T,x,T,x, x,x,x,T, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,T,T,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,x,T, x,x,x,x, x,x,x,x},
{x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,T, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,T, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x},
{x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,x},
{x,x,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x,T,x,T, T,T,T,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,T,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,T, x,x,T,x, x,x,x,x, x,x,x,T, x,x,x,x, T,x,x,x, x,T,x,x, x,x,x,x, T,x,x,x, x,x,T,x, x,x,T,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,T,x, x,x,x,x, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,x,x, x,x,x,x, x,T,T,x, x,x,x,x, x,x,x,x, T,T,x,x, x,x,x,T, x,x,x,x, x,x,x,x}
};
} // end Parser
public class Errors {
public int count = 0; // number of errors detected
public System.IO.TextWriter errorStream = Console.Out; // error messages go to this stream
public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text
public void SynErr (int line, int col, int n) {
string s;
switch (n) {
case 0: s = "EOF expected"; break;
case 1: s = "EOL expected"; break;
case 2: s = "ident expected"; break;
case 3: s = "LiteralString expected"; break;
case 4: s = "LiteralCharacter expected"; break;
case 5: s = "LiteralInteger expected"; break;
case 6: s = "LiteralDouble expected"; break;
case 7: s = "LiteralSingle expected"; break;
case 8: s = "LiteralDecimal expected"; break;
case 9: s = "LiteralDate expected"; break;
case 10: s = "\"=\" expected"; break;
case 11: s = "\":\" expected"; break;
case 12: s = "\",\" expected"; break;
case 13: s = "\"&\" expected"; break;
case 14: s = "\"/\" expected"; break;
case 15: s = "\"\\\\\" expected"; break;
case 16: s = "\".\" expected"; break;
case 17: s = "\"!\" expected"; break;
case 18: s = "\"-\" expected"; break;
case 19: s = "\"+\" expected"; break;
case 20: s = "\"^\" expected"; break;
case 21: s = "\"?\" expected"; break;
case 22: s = "\"*\" expected"; break;
case 23: s = "\"{\" expected"; break;
case 24: s = "\"}\" expected"; break;
case 25: s = "\"(\" expected"; break;
case 26: s = "\")\" expected"; break;
case 27: s = "\">\" expected"; break;
case 28: s = "\"<\" expected"; break;
case 29: s = "\"<>\" expected"; break;
case 30: s = "\">=\" expected"; break;
case 31: s = "\"<=\" expected"; break;
case 32: s = "\"<<\" expected"; break;
case 33: s = "\">>\" expected"; break;
case 34: s = "\"+=\" expected"; break;
case 35: s = "\"^=\" expected"; break;
case 36: s = "\"-=\" expected"; break;
case 37: s = "\"*=\" expected"; break;
case 38: s = "\"/=\" expected"; break;
case 39: s = "\"\\\\=\" expected"; break;
case 40: s = "\"<<=\" expected"; break;
case 41: s = "\">>=\" expected"; break;
case 42: s = "\"&=\" expected"; break;
case 43: s = "\"AddHandler\" expected"; break;
case 44: s = "\"AddressOf\" expected"; break;
case 45: s = "\"Aggregate\" expected"; break;
case 46: s = "\"Alias\" expected"; break;
case 47: s = "\"And\" expected"; break;
case 48: s = "\"AndAlso\" expected"; break;
case 49: s = "\"Ansi\" expected"; break;
case 50: s = "\"As\" expected"; break;
case 51: s = "\"Ascending\" expected"; break;
case 52: s = "\"Assembly\" expected"; break;
case 53: s = "\"Auto\" expected"; break;
case 54: s = "\"Binary\" expected"; break;
case 55: s = "\"Boolean\" expected"; break;
case 56: s = "\"ByRef\" expected"; break;
case 57: s = "\"By\" expected"; break;
case 58: s = "\"Byte\" expected"; break;
case 59: s = "\"ByVal\" expected"; break;
case 60: s = "\"Call\" expected"; break;
case 61: s = "\"Case\" expected"; break;
case 62: s = "\"Catch\" expected"; break;
case 63: s = "\"CBool\" expected"; break;
case 64: s = "\"CByte\" expected"; break;
case 65: s = "\"CChar\" expected"; break;
case 66: s = "\"CDate\" expected"; break;
case 67: s = "\"CDbl\" expected"; break;
case 68: s = "\"CDec\" expected"; break;
case 69: s = "\"Char\" expected"; break;
case 70: s = "\"CInt\" expected"; break;
case 71: s = "\"Class\" expected"; break;
case 72: s = "\"CLng\" expected"; break;
case 73: s = "\"CObj\" expected"; break;
case 74: s = "\"Compare\" expected"; break;
case 75: s = "\"Const\" expected"; break;
case 76: s = "\"Continue\" expected"; break;
case 77: s = "\"CSByte\" expected"; break;
case 78: s = "\"CShort\" expected"; break;
case 79: s = "\"CSng\" expected"; break;
case 80: s = "\"CStr\" expected"; break;
case 81: s = "\"CType\" expected"; break;
case 82: s = "\"CUInt\" expected"; break;
case 83: s = "\"CULng\" expected"; break;
case 84: s = "\"CUShort\" expected"; break;
case 85: s = "\"Custom\" expected"; break;
case 86: s = "\"Date\" expected"; break;
case 87: s = "\"Decimal\" expected"; break;
case 88: s = "\"Declare\" expected"; break;
case 89: s = "\"Default\" expected"; break;
case 90: s = "\"Delegate\" expected"; break;
case 91: s = "\"Descending\" expected"; break;
case 92: s = "\"Dim\" expected"; break;
case 93: s = "\"DirectCast\" expected"; break;
case 94: s = "\"Distinct\" expected"; break;
case 95: s = "\"Do\" expected"; break;
case 96: s = "\"Double\" expected"; break;
case 97: s = "\"Each\" expected"; break;
case 98: s = "\"Else\" expected"; break;
case 99: s = "\"ElseIf\" expected"; break;
case 100: s = "\"End\" expected"; break;
case 101: s = "\"EndIf\" expected"; break;
case 102: s = "\"Enum\" expected"; break;
case 103: s = "\"Equals\" expected"; break;
case 104: s = "\"Erase\" expected"; break;
case 105: s = "\"Error\" expected"; break;
case 106: s = "\"Event\" expected"; break;
case 107: s = "\"Exit\" expected"; break;
case 108: s = "\"Explicit\" expected"; break;
case 109: s = "\"False\" expected"; break;
case 110: s = "\"Finally\" expected"; break;
case 111: s = "\"For\" expected"; break;
case 112: s = "\"Friend\" expected"; break;
case 113: s = "\"From\" expected"; break;
case 114: s = "\"Function\" expected"; break;
case 115: s = "\"Get\" expected"; break;
case 116: s = "\"GetType\" expected"; break;
case 117: s = "\"Global\" expected"; break;
case 118: s = "\"GoSub\" expected"; break;
case 119: s = "\"GoTo\" expected"; break;
case 120: s = "\"Group\" expected"; break;
case 121: s = "\"Handles\" expected"; break;
case 122: s = "\"If\" expected"; break;
case 123: s = "\"Implements\" expected"; break;
case 124: s = "\"Imports\" expected"; break;
case 125: s = "\"In\" expected"; break;
case 126: s = "\"Infer\" expected"; break;
case 127: s = "\"Inherits\" expected"; break;
case 128: s = "\"Integer\" expected"; break;
case 129: s = "\"Interface\" expected"; break;
case 130: s = "\"Into\" expected"; break;
case 131: s = "\"Is\" expected"; break;
case 132: s = "\"IsNot\" expected"; break;
case 133: s = "\"Join\" expected"; break;
case 134: s = "\"Let\" expected"; break;
case 135: s = "\"Lib\" expected"; break;
case 136: s = "\"Like\" expected"; break;
case 137: s = "\"Long\" expected"; break;
case 138: s = "\"Loop\" expected"; break;
case 139: s = "\"Me\" expected"; break;
case 140: s = "\"Mod\" expected"; break;
case 141: s = "\"Module\" expected"; break;
case 142: s = "\"MustInherit\" expected"; break;
case 143: s = "\"MustOverride\" expected"; break;
case 144: s = "\"MyBase\" expected"; break;
case 145: s = "\"MyClass\" expected"; break;
case 146: s = "\"Namespace\" expected"; break;
case 147: s = "\"Narrowing\" expected"; break;
case 148: s = "\"New\" expected"; break;
case 149: s = "\"Next\" expected"; break;
case 150: s = "\"Not\" expected"; break;
case 151: s = "\"Nothing\" expected"; break;
case 152: s = "\"NotInheritable\" expected"; break;
case 153: s = "\"NotOverridable\" expected"; break;
case 154: s = "\"Object\" expected"; break;
case 155: s = "\"Of\" expected"; break;
case 156: s = "\"Off\" expected"; break;
case 157: s = "\"On\" expected"; break;
case 158: s = "\"Operator\" expected"; break;
case 159: s = "\"Option\" expected"; break;
case 160: s = "\"Optional\" expected"; break;
case 161: s = "\"Or\" expected"; break;
case 162: s = "\"Order\" expected"; break;
case 163: s = "\"OrElse\" expected"; break;
case 164: s = "\"Overloads\" expected"; break;
case 165: s = "\"Overridable\" expected"; break;
case 166: s = "\"Overrides\" expected"; break;
case 167: s = "\"ParamArray\" expected"; break;
case 168: s = "\"Partial\" expected"; break;
case 169: s = "\"Preserve\" expected"; break;
case 170: s = "\"Private\" expected"; break;
case 171: s = "\"Property\" expected"; break;
case 172: s = "\"Protected\" expected"; break;
case 173: s = "\"Public\" expected"; break;
case 174: s = "\"RaiseEvent\" expected"; break;
case 175: s = "\"ReadOnly\" expected"; break;
case 176: s = "\"ReDim\" expected"; break;
case 177: s = "\"Rem\" expected"; break;
case 178: s = "\"RemoveHandler\" expected"; break;
case 179: s = "\"Resume\" expected"; break;
case 180: s = "\"Return\" expected"; break;
case 181: s = "\"SByte\" expected"; break;
case 182: s = "\"Select\" expected"; break;
case 183: s = "\"Set\" expected"; break;
case 184: s = "\"Shadows\" expected"; break;
case 185: s = "\"Shared\" expected"; break;
case 186: s = "\"Short\" expected"; break;
case 187: s = "\"Single\" expected"; break;
case 188: s = "\"Skip\" expected"; break;
case 189: s = "\"Static\" expected"; break;
case 190: s = "\"Step\" expected"; break;
case 191: s = "\"Stop\" expected"; break;
case 192: s = "\"Strict\" expected"; break;
case 193: s = "\"String\" expected"; break;
case 194: s = "\"Structure\" expected"; break;
case 195: s = "\"Sub\" expected"; break;
case 196: s = "\"SyncLock\" expected"; break;
case 197: s = "\"Take\" expected"; break;
case 198: s = "\"Text\" expected"; break;
case 199: s = "\"Then\" expected"; break;
case 200: s = "\"Throw\" expected"; break;
case 201: s = "\"To\" expected"; break;
case 202: s = "\"True\" expected"; break;
case 203: s = "\"Try\" expected"; break;
case 204: s = "\"TryCast\" expected"; break;
case 205: s = "\"TypeOf\" expected"; break;
case 206: s = "\"UInteger\" expected"; break;
case 207: s = "\"ULong\" expected"; break;
case 208: s = "\"Unicode\" expected"; break;
case 209: s = "\"Until\" expected"; break;
case 210: s = "\"UShort\" expected"; break;
case 211: s = "\"Using\" expected"; break;
case 212: s = "\"Variant\" expected"; break;
case 213: s = "\"Wend\" expected"; break;
case 214: s = "\"When\" expected"; break;
case 215: s = "\"Where\" expected"; break;
case 216: s = "\"While\" expected"; break;
case 217: s = "\"Widening\" expected"; break;
case 218: s = "\"With\" expected"; break;
case 219: s = "\"WithEvents\" expected"; break;
case 220: s = "\"WriteOnly\" expected"; break;
case 221: s = "\"Xor\" expected"; break;
case 222: s = "??? expected"; break;
case 223: s = "invalid NamespaceMemberDeclaration"; break;
case 224: s = "invalid StatementTerminator"; break;
case 225: s = "invalid TypeModifier"; break;
case 226: s = "invalid SubOrFunctionDeclaration"; break;
case 227: s = "invalid SubOrFunctionDeclaration"; break;
case 228: s = "invalid MemberModifier"; break;
case 229: s = "invalid ParameterModifier"; break;
case 230: s = "invalid Identifier"; break;
case 231: s = "invalid IdentifierForFieldDeclaration"; break;
case 232: s = "invalid AccessModifier"; break;
default: s = "error " + n; break;
}
errorStream.WriteLine(errMsgFormat, line, col, s);
count++;
}
public void SemErr (int line, int col, string s) {
errorStream.WriteLine(errMsgFormat, line, col, s);
count++;
}
public void SemErr (string s) {
errorStream.WriteLine(s);
count++;
}
public void Warning (int line, int col, string s) {
errorStream.WriteLine(errMsgFormat, line, col, s);
}
public void Warning(string s) {
errorStream.WriteLine(s);
}
} // Errors
public class FatalError: Exception {
public FatalError(string m): base(m) {}
}
}

161
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Parser.frame

@ -0,0 +1,161 @@ @@ -0,0 +1,161 @@
/*----------------------------------------------------------------------
Compiler Generator Coco/R,
Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz
extended by M. Loeberbauer & A. Woess, Univ. of Linz
with improvements by Pat Terry, Rhodes University
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
As an exception, it is allowed to write an extension of Coco/R that is
used as a plugin in non-free software.
If not otherwise stated, any source code generated by Coco/R (other than
Coco/R itself) does not fall under the GNU General Public License.
----------------------------------------------------------------------*/
-->begin
using System;
-->namespace
public partial class Parser {
-->constants
const bool T = true;
const bool x = false;
const int minErrDist = 2;
public ILexer lexer;
public Errors errors;
public Parser(ILexer lexer)
{
this.lexer = lexer;
this.errors = new Errors();
}
public Token t; // last recognized token
public Token la; // lookahead token
int errDist = minErrDist;
-->declarations
void SynErr (int n) {
if (errDist >= minErrDist) errors.SynErr(la.line, la.col, n);
errDist = 0;
}
public void SemErr (string msg) {
if (errDist >= minErrDist) errors.SemErr(t.line, t.col, msg);
errDist = 0;
}
void Get () {
for (;;) {
t = la;
la = lexer.NextToken();
if (la.kind <= maxT) { ++errDist; break; }
-->pragmas
la = t;
}
}
void Expect (int n) {
if (la.kind==n) Get(); else { SynErr(n); }
}
bool StartOf (int s) {
return set[s, 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, kind] || set[repFol, kind] || set[0, kind])) {
Get();
kind = la.kind;
}
return StartOf(syFol);
}
}
-->productions
public void Parse() {
PushContext(Context.Global);
la = new Token(1, 1, 1);
Get();
-->parseRoot
Expect(0);
PopContext();
}
static readonly bool[,] set = {
-->initialization
};
} // end Parser
public class Errors {
public int count = 0; // number of errors detected
public System.IO.TextWriter errorStream = Console.Out; // error messages go to this stream
public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text
public void SynErr (int line, int col, int n) {
string s;
switch (n) {
-->errors
default: s = "error " + n; break;
}
errorStream.WriteLine(errMsgFormat, line, col, s);
count++;
}
public void SemErr (int line, int col, string s) {
errorStream.WriteLine(errMsgFormat, line, col, s);
count++;
}
public void SemErr (string s) {
errorStream.WriteLine(s);
count++;
}
public void Warning (int line, int col, string s) {
errorStream.WriteLine(errMsgFormat, line, col, s);
}
public void Warning(string s) {
errorStream.WriteLine(s);
}
} // Errors
public class FatalError: Exception {
public FatalError(string m): base(m) {}
}
$$$

390
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ParserHelper.atg

@ -0,0 +1,390 @@ @@ -0,0 +1,390 @@
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.NRefactory.Parser.VB;
using ASTAttribute = ICSharpCode.NRefactory.Ast.Attribute;
using ICSharpCode.NRefactory.Parser.VBNet.Experimental;
COMPILER ParserHelper
/* START AUTOGENERATED TOKENS SECTION */
TOKENS
/* ----- terminal classes ----- */
/* EOF is 0 */
EOL
ident
LiteralString
LiteralCharacter
LiteralInteger
LiteralDouble
LiteralSingle
LiteralDecimal
LiteralDate
/* ----- 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"
"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"
"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"
/* END AUTOGENERATED TOKENS SECTION */
PRODUCTIONS
/*------------------------------------------------------------------------*/
ParserHelper =
{ OptionStatement }
{ ImportsStatement }
{ AttributeBlock }
{ NamespaceMemberDeclaration }
.
StatementTerminator = EOL | ":" .
OptionStatement =
"Option" { ANY } StatementTerminator
.
ImportsStatement =
"Imports" { ANY } StatementTerminator
.
AttributeBlock =
Attribute { Attribute } StatementTerminator
.
Attribute =
[ EOL ] "<" { ANY } ">" [ EOL ]
.
NamespaceMemberDeclaration =
NamespaceDeclaration | TypeDeclaration
.
NamespaceDeclaration =
"Namespace" { ANY } StatementTerminator
{ NamespaceMemberDeclaration }
"End" "Namespace" StatementTerminator
.
TypeDeclaration =
{ AttributeBlock }
{ TypeModifier }
"Module" { ANY } StatementTerminator
(. PushContext(Context.Type); .)
{ ModuleMemberDeclaration }
"End" "Module" StatementTerminator
(. PopContext(); .)
.
ModuleMemberDeclaration
(. PushContext(Context.Member); .)
=
SubOrFunctionDeclaration
(. PopContext(); .)
.
SubOrFunctionDeclaration =
{ AttributeBlock } { MemberModifier } ("Sub" | "Function")
(. PushContext(Context.IdentifierExpected); .) ANY (. PopContext(); .)
[ "(" [ ParameterList ] ")" ] EOL
[ Block ]
"End" ("Sub" | "Function") StatementTerminator
.
ParameterList =
Parameter { "," Parameter }
.
Parameter =
{ AttributeBlock } { ParameterModifier } Identifier [ "As" ANY ] [ "=" { ANY } ]
.
Block =
EOL
.
/* This production handles pseudo keywords that are needed in the grammar */
Identifier
(. PushContext(Context.IdentifierExpected); .)
=
(
IdentifierForFieldDeclaration
|
"Custom"
)
(. PopContext(); .)
.
IdentifierForFieldDeclaration =
ident
| "Aggregate"
| "Ansi"
| "Ascending"
| "Assembly"
| "Auto"
| "Binary"
| "By"
| "Compare"
| "Descending"
| "Distinct"
| "Equals"
| "Explicit"
| "From"
| "Group"
| "Infer"
| "Into"
| "Join"
| "Off"
| "Order"
| "Preserve"
| "Skip"
| "Take"
| "Text"
| "Unicode"
| "Until"
| "Where"
.
AccessModifier =
"Public" |
"Friend" |
"Protected" [ "Friend" ] |
"Private"
.
TypeModifier =
AccessModifier |
"Shadows"
.
MemberModifier =
AccessModifier |
"Shadows" |
"Shared" |
"Overridable" |
"NotOverridable" |
"Overrides" |
"Overloads" |
"Partial"
.
ParameterModifier =
"ByVal" |
"ByRef" |
"Optional" |
"ParamArray"
.
END ParserHelper.

48
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ParserHelper.cs

@ -0,0 +1,48 @@ @@ -0,0 +1,48 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Siegfried Pammer" email="siegfriedpammer@gmail.com" />
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental
{
partial class Parser
{
Stack<Context> stack = new Stack<Context>();
void PopContext()
{
if (stack.Count > 0) {
string indent = new string('\t', stack.Count - 1);
var item = stack.Pop();
Console.WriteLine(indent + "exit " + item);
} else {
Console.WriteLine("empty stack");
}
}
void PushContext(Context context)
{
string indent = new string('\t', stack.Count);
stack.Push(context);
Console.WriteLine(indent + "enter " + context);
}
void SetContext(Context context)
{
PopContext();
PushContext(context);
}
}
public enum Context {
Global,
Type,
Member,
IdentifierExpected
}
}

363
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Scanner.frame

@ -0,0 +1,363 @@ @@ -0,0 +1,363 @@
/*----------------------------------------------------------------------
Compiler Generator Coco/R,
Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz
extended by M. Loeberbauer & A. Woess, Univ. of Linz
with improvements by Pat Terry, Rhodes University
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
As an exception, it is allowed to write an extension of Coco/R that is
used as a plugin in non-free software.
If not otherwise stated, any source code generated by Coco/R (other than
Coco/R itself) does not fall under the GNU General Public License.
-----------------------------------------------------------------------*/
-->begin
using System;
using System.IO;
using System.Collections.Generic;
-->namespace
public class Token {
public int kind; // token kind
public int pos; // token position in the source text (starting at 0)
public int col; // token column (starting at 1)
public int line; // token line (starting at 1)
public string val; // token value
public Token next; // ML 2005-03-11 Tokens are kept in linked list
}
//-----------------------------------------------------------------------------------
// Buffer
//-----------------------------------------------------------------------------------
public class Buffer {
// This Buffer supports the following cases:
// 1) seekable stream (file)
// a) whole stream in buffer
// b) part of stream in buffer
// 2) non seekable stream (network, console)
public const int EOF = char.MaxValue + 1;
const int MIN_BUFFER_LENGTH = 1024; // 1KB
const int MAX_BUFFER_LENGTH = MIN_BUFFER_LENGTH * 64; // 64KB
byte[] buf; // input buffer
int bufStart; // position of first byte in buffer relative to input stream
int bufLen; // length of buffer
int fileLen; // length of input stream (may change if the stream is no file)
int bufPos; // current position in buffer
Stream stream; // input stream (seekable)
bool isUserStream; // was the stream opened by the user?
public Buffer (Stream s, bool isUserStream) {
stream = s; this.isUserStream = isUserStream;
if (stream.CanSeek) {
fileLen = (int) stream.Length;
bufLen = Math.Min(fileLen, MAX_BUFFER_LENGTH);
bufStart = Int32.MaxValue; // nothing in the buffer so far
} else {
fileLen = bufLen = bufStart = 0;
}
buf = new byte[(bufLen>0) ? bufLen : MIN_BUFFER_LENGTH];
if (fileLen > 0) Pos = 0; // setup buffer to position 0 (start)
else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid
if (bufLen == fileLen && stream.CanSeek) Close();
}
protected Buffer(Buffer b) { // called in UTF8Buffer constructor
buf = b.buf;
bufStart = b.bufStart;
bufLen = b.bufLen;
fileLen = b.fileLen;
bufPos = b.bufPos;
stream = b.stream;
// keep destructor from closing the stream
b.stream = null;
isUserStream = b.isUserStream;
}
~Buffer() { Close(); }
protected void Close() {
if (!isUserStream && stream != null) {
stream.Close();
stream = null;
}
}
public virtual int Read () {
if (bufPos < bufLen) {
return buf[bufPos++];
} else if (Pos < fileLen) {
Pos = Pos; // shift buffer start to Pos
return buf[bufPos++];
} else if (stream != null && !stream.CanSeek && ReadNextStreamChunk() > 0) {
return buf[bufPos++];
} else {
return EOF;
}
}
public int Peek () {
int curPos = Pos;
int ch = Read();
Pos = curPos;
return ch;
}
public string GetString (int beg, int end) {
int len = 0;
char[] buf = new char[end - beg];
int oldPos = Pos;
Pos = beg;
while (Pos < end) buf[len++] = (char) Read();
Pos = oldPos;
return new String(buf, 0, len);
}
public int Pos {
get { return bufPos + bufStart; }
set {
if (value >= fileLen && stream != null && !stream.CanSeek) {
// Wanted position is after buffer and the stream
// is not seek-able e.g. network or console,
// thus we have to read the stream manually till
// the wanted position is in sight.
while (value >= fileLen && ReadNextStreamChunk() > 0);
}
if (value < 0 || value > fileLen) {
throw new FatalError("buffer out of bounds access, position: " + value);
}
if (value >= bufStart && value < bufStart + bufLen) { // already in buffer
bufPos = value - bufStart;
} else if (stream != null) { // must be swapped in
stream.Seek(value, SeekOrigin.Begin);
bufLen = stream.Read(buf, 0, buf.Length);
bufStart = value; bufPos = 0;
} else {
// set the position to the end of the file, Pos will return fileLen.
bufPos = fileLen - bufStart;
}
}
}
// Read the next chunk of bytes from the stream, increases the buffer
// if needed and updates the fields fileLen and bufLen.
// Returns the number of bytes read.
private int ReadNextStreamChunk() {
int free = buf.Length - bufLen;
if (free == 0) {
// in the case of a growing input stream
// we can neither seek in the stream, nor can we
// foresee the maximum length, thus we must adapt
// the buffer size on demand.
byte[] newBuf = new byte[bufLen * 2];
Array.Copy(buf, newBuf, bufLen);
buf = newBuf;
free = bufLen;
}
int read = stream.Read(buf, bufLen, free);
if (read > 0) {
fileLen = bufLen = (bufLen + read);
return read;
}
// end of stream reached
return 0;
}
}
//-----------------------------------------------------------------------------------
// UTF8Buffer
//-----------------------------------------------------------------------------------
public class UTF8Buffer: Buffer {
public UTF8Buffer(Buffer b): base(b) {}
public override int Read() {
int ch;
do {
ch = base.Read();
// until we find a utf8 start (0xxxxxxx or 11xxxxxx)
} while ((ch >= 128) && ((ch & 0xC0) != 0xC0) && (ch != EOF));
if (ch < 128 || ch == EOF) {
// nothing to do, first 127 chars are the same in ascii and utf8
// 0xxxxxxx or end of file character
} else if ((ch & 0xF0) == 0xF0) {
// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
int c1 = ch & 0x07; ch = base.Read();
int c2 = ch & 0x3F; ch = base.Read();
int c3 = ch & 0x3F; ch = base.Read();
int c4 = ch & 0x3F;
ch = (((((c1 << 6) | c2) << 6) | c3) << 6) | c4;
} else if ((ch & 0xE0) == 0xE0) {
// 1110xxxx 10xxxxxx 10xxxxxx
int c1 = ch & 0x0F; ch = base.Read();
int c2 = ch & 0x3F; ch = base.Read();
int c3 = ch & 0x3F;
ch = (((c1 << 6) | c2) << 6) | c3;
} else if ((ch & 0xC0) == 0xC0) {
// 110xxxxx 10xxxxxx
int c1 = ch & 0x1F; ch = base.Read();
int c2 = ch & 0x3F;
ch = (c1 << 6) | c2;
}
return ch;
}
}
//-----------------------------------------------------------------------------------
// Scanner
//-----------------------------------------------------------------------------------
public class Scanner {
const char EOL = '\n';
const int eofSym = 0; /* pdt */
-->declarations
public Buffer buffer; // scanner buffer
Token t; // current token
int ch; // current input character
int pos; // byte position of current character
int col; // column number of current character
int line; // line number of current character
int oldEols; // EOLs that appeared in a comment;
static readonly Dictionary<int, int> start; // maps first token character to start state
Token tokens; // list of tokens already peeked (first token is a dummy)
Token pt; // current peek token
char[] tval = new char[128]; // text of current token
int tlen; // length of current token
static Scanner() {
start = new Dictionary<int, int>(128);
-->initialization
}
public Scanner (string fileName) {
try {
Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
buffer = new Buffer(stream, false);
Init();
} catch (IOException) {
throw new FatalError("Cannot open file " + fileName);
}
}
public Scanner (Stream s) {
buffer = new Buffer(s, true);
Init();
}
void Init() {
pos = -1; line = 1; col = 0;
oldEols = 0;
NextCh();
if (ch == 0xEF) { // check optional byte order mark for UTF-8
NextCh(); int ch1 = ch;
NextCh(); int ch2 = ch;
if (ch1 != 0xBB || ch2 != 0xBF) {
throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2));
}
buffer = new UTF8Buffer(buffer); col = 0;
NextCh();
}
pt = tokens = new Token(); // first token is a dummy
}
void NextCh() {
if (oldEols > 0) { ch = EOL; oldEols--; }
else {
pos = buffer.Pos;
ch = buffer.Read(); col++;
// replace isolated '\r' by '\n' in order to make
// eol handling uniform across Windows, Unix and Mac
if (ch == '\r' && buffer.Peek() != '\n') ch = EOL;
if (ch == EOL) { line++; col = 0; }
}
-->casing1
}
void AddCh() {
if (tlen >= tval.Length) {
char[] newBuf = new char[2 * tval.Length];
Array.Copy(tval, 0, newBuf, 0, tval.Length);
tval = newBuf;
}
if (ch != Buffer.EOF) {
-->casing2
NextCh();
}
}
-->comments
void CheckLiteral() {
-->literals
}
Token NextToken() {
while (ch == ' ' ||
-->scan1
) NextCh();
-->scan2
t = new Token();
t.pos = pos; t.col = col; t.line = line;
int state;
if (!start.TryGetValue(ch, out state))
state = 0;
tlen = 0; AddCh();
switch (state) {
case -1: { t.kind = eofSym; break; } // NextCh already done
case 0: { t.kind = noSym; break; } // NextCh already done
-->scan3
}
t.val = new String(tval, 0, tlen);
return t;
}
// get the next token (possibly a token already seen during peeking)
public Token Scan () {
if (tokens.next == null) {
return NextToken();
} else {
pt = tokens = tokens.next;
return tokens;
}
}
// peek for the next token, ignore pragmas
public Token Peek () {
do {
if (pt.next == null) {
pt.next = NextToken();
}
pt = pt.next;
} while (pt.kind > maxT); // skip pragmas
return pt;
}
// make sure that peeking starts at the current scan position
public void ResetPeek () { pt = tokens; }
} // end Scanner
$$$

50
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/Program.cs

@ -0,0 +1,50 @@ @@ -0,0 +1,50 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Siegfried Pammer" email="siegfriedpammer@gmail.com" />
// <version>$Revision$</version>
// </file>
using System;
using System.IO;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Parser.VB;
using ICSharpCode.NRefactory.Parser.VBNet.Experimental;
namespace VBParserExperiment
{
class Program
{
static string data = @"Option Explicit
Option Strict On
Imports System
Imports System.Linq
Module Program
End Module
Namespace Test
Module Functions
Public Sub New()
End Sub
Public Sub Test(ByVal x As Integer)
End Sub
End Module
End Namespace
";
public static void Main(string[] args)
{
Parser p = new Parser(ParserFactory.CreateLexer(SupportedLanguage.VBNet, new StringReader(data)));
p.Parse();
Console.ReadKey(true);
}
}
}

31
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/Properties/AssemblyInfo.cs

@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
#region Using directives
using System;
using System.Reflection;
using System.Runtime.InteropServices;
#endregion
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("VBParserExperiment")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("VBParserExperiment")]
[assembly: AssemblyCopyright("Copyright 2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// This sets the default COM visibility of types in the assembly to invisible.
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
[assembly: ComVisible(false)]
// The assembly version has following format :
//
// Major.Minor.Build.Revision
//
// You can specify all the values or you can use the default the Revision and
// Build Numbers by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.*")]

61
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/VBParserExperiment.csproj

@ -0,0 +1,61 @@ @@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<PropertyGroup>
<ProjectGuid>{A21BF46E-27BC-4DCA-AB11-462BE5B0B028}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<OutputType>Exe</OutputType>
<RootNamespace>VBParserExperiment</RootNamespace>
<AssemblyName>VBParserExperiment</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<AppDesignerFolder>Properties</AppDesignerFolder>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'x86' ">
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<OutputPath>bin\Debug\</OutputPath>
<DebugSymbols>True</DebugSymbols>
<DebugType>Full</DebugType>
<Optimize>False</Optimize>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
<DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<OutputPath>bin\Release\</OutputPath>
<DebugSymbols>False</DebugSymbols>
<DebugType>None</DebugType>
<Optimize>True</Optimize>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Data.DataSetExtensions">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\..\NRefactory.csproj">
<Project>{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}</Project>
<Name>NRefactory</Name>
</ProjectReference>
<ProjectReference Include="..\..\SharpDevelop\4.0\SharpDevelop\src\Libraries\NRefactory\Project\NRefactory.csproj">
<Project>{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}</Project>
<Name>NRefactory</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project>

2004
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs

File diff suppressed because it is too large Load Diff

89
src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG

@ -367,9 +367,9 @@ NamespaceMemberDecl @@ -367,9 +367,9 @@ NamespaceMemberDecl
/* 4.9.1 */
TypeParameterList<List<TemplateDefinition> templates>
(.
=(.
TemplateDefinition template;
.) =
.)
[
IF (la.kind == Tokens.OpenParenthesis && Peek(1).kind == Tokens.Of)
"(" "Of" TypeParameter<out template>
@ -1094,7 +1094,7 @@ StructureMemberDecl<ModifierList m, List<AttributeSection> attributes> @@ -1094,7 +1094,7 @@ StructureMemberDecl<ModifierList m, List<AttributeSection> attributes>
TypeName<out type>
)
]
[ "=" VariableInitializer<out initializer> ]
[ "=" Expr<out initializer> ]
[ ImplementsClause<out implementsClause> ]
EndOfStmt
(
@ -1488,7 +1488,7 @@ VariableDeclaratorPartAfterIdentifier<List<VariableDeclaration> fieldDeclaration @@ -1488,7 +1488,7 @@ VariableDeclaratorPartAfterIdentifier<List<VariableDeclaration> fieldDeclaration
}
}
.)
[ "=" VariableInitializer<out expr> ]
[ "=" Expr<out expr> ]
)
(.
VariableDeclaration varDecl = new VariableDeclaration(name, expr, type);
@ -1526,29 +1526,20 @@ InitializationRankList<out List<Expression> rank> @@ -1526,29 +1526,20 @@ InitializationRankList<out List<Expression> rank>
}
.
/* 9.6.3 */
VariableInitializer<out Expression initializerExpression>
(.
initializerExpression = null;
.) =
Expr<out initializerExpression>
| CollectionInitializer<out initializerExpression>
.
/* 9.6.3.4 */
CollectionInitializer<out Expression outExpr>
CollectionInitializer<out CollectionInitializerExpression outExpr>
(.
Expression expr = null;
CollectionInitializerExpression initializer = new CollectionInitializerExpression();
.) =
"{"
[
VariableInitializer<out expr>
Expr<out expr>
(.
if (expr != null) { initializer.CreateExpressions.Add(expr); }
.)
{
IF (NotFinalComma()) "," VariableInitializer<out expr>
IF (NotFinalComma()) "," Expr<out expr>
(. if (expr != null) { initializer.CreateExpressions.Add(expr); } .)
}
]
@ -1963,7 +1954,7 @@ ExponentiationExpr<out Expression outExpr> @@ -1963,7 +1954,7 @@ ExponentiationExpr<out Expression outExpr>
ObjectCreateExpression<out Expression oce>
(.
TypeReference type = null;
Expression initializer = null;
CollectionInitializerExpression initializer = null;
List<Expression> arguments = null;
ArrayList dimensions = null;
oce = null;
@ -1987,36 +1978,47 @@ ObjectCreateExpression<out Expression oce> @@ -1987,36 +1978,47 @@ ObjectCreateExpression<out Expression oce>
if (dimensions == null) dimensions = new ArrayList();
dimensions.Insert(0, (arguments == null) ? 0 : Math.Max(arguments.Count - 1, 0));
type.RankSpecifier = (int[])dimensions.ToArray(typeof(int));
ArrayCreateExpression ace = new ArrayCreateExpression(type, initializer as CollectionInitializerExpression);
ArrayCreateExpression ace = new ArrayCreateExpression(type, initializer);
ace.Arguments = arguments;
oce = ace;
}
.)
[
(.
NamedArgumentExpression memberInitializer = null;
.)
"With"
(.
CollectionInitializerExpression memberInitializers = new CollectionInitializerExpression();
memberInitializers.StartLocation = la.Location;
.)
"{"
MemberInitializer<out memberInitializer>
(. memberInitializers.CreateExpressions.Add(memberInitializer); .)
{ ","
(
(.
MemberInitializerExpression memberInitializer = null;
.)
"With"
(.
CollectionInitializerExpression memberInitializers = new CollectionInitializerExpression();
memberInitializers.StartLocation = la.Location;
.)
"{"
MemberInitializer<out memberInitializer>
(. memberInitializers.CreateExpressions.Add(memberInitializer); .)
}
"}"
(.
memberInitializers.EndLocation = t.Location;
if(oce is ObjectCreateExpression)
{
((ObjectCreateExpression)oce).ObjectInitializer = memberInitializers;
}
.)
{ ","
MemberInitializer<out memberInitializer>
(. memberInitializers.CreateExpressions.Add(memberInitializer); .)
}
"}"
(.
memberInitializers.EndLocation = t.Location;
if(oce is ObjectCreateExpression)
{
((ObjectCreateExpression)oce).ObjectInitializer = memberInitializers;
}
.)
)
|
(
"From"
CollectionInitializer<out initializer>
(.
if(oce is ObjectCreateExpression)
((ObjectCreateExpression)oce).ObjectInitializer = initializer;
.)
)
]
.
@ -2362,17 +2364,20 @@ JoinCondition<out QueryExpressionJoinConditionVB condition> @@ -2362,17 +2364,20 @@ JoinCondition<out QueryExpressionJoinConditionVB condition>
.)
.
MemberInitializer<out NamedArgumentExpression memberInitializer>
MemberInitializer<out MemberInitializerExpression memberInitializer>
(.
memberInitializer = new NamedArgumentExpression();
memberInitializer = new MemberInitializerExpression();
memberInitializer.StartLocation = la.Location;
Expression initExpr = null;
bool isKey = false;
string name = null;
.) =
/*[ "Key" (. isKey = true; .) ]*/
"." IdentifierOrKeyword<out name> "=" Expr<out initExpr>
(.
memberInitializer.Name = name;
memberInitializer.Expression = initExpr;
memberInitializer.IsKey = isKey;
memberInitializer.EndLocation = t.EndLocation;
.)
.
@ -3332,7 +3337,7 @@ Qualident<out string qualident> @@ -3332,7 +3337,7 @@ Qualident<out string qualident>
/* This production handles pseudo keywords that are needed in the grammar */
Identifier =
IdentifierForFieldDeclaration
| "Custom"
| "Custom"
.
IdentifierForFieldDeclaration =

5
src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs

@ -2647,7 +2647,10 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -2647,7 +2647,10 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
CollectionInitializerExpression initializer = objectCreateExpression.ObjectInitializer;
if (!initializer.IsNull) {
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.With);
if (initializer.CreateExpressions.Any(ce => ce is NamedArgumentExpression))
outputFormatter.PrintToken(Tokens.With);
else
outputFormatter.PrintToken(Tokens.From);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.OpenCurlyBrace);
outputFormatter.IndentationLevel++;

6
src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs

@ -625,6 +625,12 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -625,6 +625,12 @@ namespace ICSharpCode.NRefactory.Visitors {
return lockStatement.EmbeddedStatement.AcceptVisitor(this, data);
}
public virtual object VisitMemberInitializerExpression(MemberInitializerExpression memberInitializerExpression, object data) {
Debug.Assert((memberInitializerExpression != null));
Debug.Assert((memberInitializerExpression.Expression != null));
return memberInitializerExpression.Expression.AcceptVisitor(this, data);
}
public virtual object VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression, object data) {
Debug.Assert((memberReferenceExpression != null));
Debug.Assert((memberReferenceExpression.TargetObject != null));

9
src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs

@ -1120,6 +1120,15 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1120,6 +1120,15 @@ namespace ICSharpCode.NRefactory.Visitors {
return null;
}
public virtual object VisitMemberInitializerExpression(MemberInitializerExpression memberInitializerExpression, object data) {
Debug.Assert((memberInitializerExpression != null));
Debug.Assert((memberInitializerExpression.Expression != null));
nodeStack.Push(memberInitializerExpression.Expression);
memberInitializerExpression.Expression.AcceptVisitor(this, data);
memberInitializerExpression.Expression = ((Expression)(nodeStack.Pop()));
return null;
}
public virtual object VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression, object data) {
Debug.Assert((memberReferenceExpression != null));
Debug.Assert((memberReferenceExpression.TargetObject != null));

11
src/Libraries/NRefactory/Project/Src/Visitors/NodeTrackingAstVisitor.cs

@ -451,6 +451,13 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -451,6 +451,13 @@ namespace ICSharpCode.NRefactory.Visitors {
return result;
}
public sealed override object VisitMemberInitializerExpression(MemberInitializerExpression memberInitializerExpression, object data) {
this.BeginVisit(memberInitializerExpression);
object result = this.TrackedVisitMemberInitializerExpression(memberInitializerExpression, data);
this.EndVisit(memberInitializerExpression);
return result;
}
public sealed override object VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression, object data) {
this.BeginVisit(memberReferenceExpression);
object result = this.TrackedVisitMemberReferenceExpression(memberReferenceExpression, data);
@ -1132,6 +1139,10 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1132,6 +1139,10 @@ namespace ICSharpCode.NRefactory.Visitors {
return base.VisitLockStatement(lockStatement, data);
}
public virtual object TrackedVisitMemberInitializerExpression(MemberInitializerExpression memberInitializerExpression, object data) {
return base.VisitMemberInitializerExpression(memberInitializerExpression, data);
}
public virtual object TrackedVisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression, object data) {
return base.VisitMemberReferenceExpression(memberReferenceExpression, data);
}

4
src/Libraries/NRefactory/Project/Src/Visitors/NotImplementedAstVisitor.cs

@ -258,6 +258,10 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -258,6 +258,10 @@ namespace ICSharpCode.NRefactory.Visitors {
throw new global::System.NotImplementedException("LockStatement");
}
public virtual object VisitMemberInitializerExpression(MemberInitializerExpression memberInitializerExpression, object data) {
throw new global::System.NotImplementedException("MemberInitializerExpression");
}
public virtual object VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression, object data) {
throw new global::System.NotImplementedException("MemberReferenceExpression");
}

Loading…
Cancel
Save