Browse Source
git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@5798 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61pull/1/head
24 changed files with 3660 additions and 1679 deletions
File diff suppressed because it is too large
Load Diff
@ -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) {} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -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) {} |
||||||
|
} |
||||||
|
|
||||||
|
$$$ |
||||||
@ -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. |
||||||
|
|
||||||
@ -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 |
||||||
|
} |
||||||
|
} |
||||||
@ -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 |
||||||
|
|
||||||
|
$$$ |
||||||
@ -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); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -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.*")] |
||||||
@ -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> |
||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue