Browse Source

- added BranchStatements and more unit tests

- End-statements need a hack in InformToken

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@5977 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
e3fb17b124
  1. 10
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.atg
  2. 1433
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Parser.cs
  3. 23
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/PushParser.frame
  4. 49
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/XmlModeLexerTests.cs

10
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.atg

@ -523,6 +523,7 @@ Statement = @@ -523,6 +523,7 @@ Statement =
| ErrorHandlingStatement
| ThrowStatement
| TryStatement
| BranchStatement
| InvocationStatement
.
@ -644,6 +645,15 @@ TryStatement = @@ -644,6 +645,15 @@ TryStatement =
"End" "Try"
.
BranchStatement =
"GoTo" ( Identifier | LiteralInteger )
| "Exit" ( "Do" | "For" | "While" | "Select" | "Sub" | "Function" | "Property" | "Try" )
| "Continue" ( "Do" | "For" | "While" )
| "Stop"
/*| "End" HACK End-Statements are not passed to EF-Parser from Lexer */
| "Return" (. nextTokenIsPotentialStartOfXmlMode = true; .) [ Expression ]
.
InvocationStatement =
[ "Call" ] Expression
.

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

File diff suppressed because it is too large Load Diff

23
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/PushParser.frame

@ -51,8 +51,27 @@ partial class ExpressionFinder { @@ -51,8 +51,27 @@ partial class ExpressionFinder {
void Error(Token t)
{
}
Token consumedEndToken;
public void InformToken(Token t)
{
if (consumedEndToken != null) {
if (t.kind == Tokens.EOL || t.kind == Tokens.Colon) {
consumedEndToken = null;
return; // ignore End statement
}
InformTokenInternal(consumedEndToken);
consumedEndToken = null;
}
if (t.kind == Tokens.End) {
consumedEndToken = t;
} else {
InformTokenInternal(t);
}
}
void InformTokenInternal(Token t)
{
nextTokenIsPotentialStartOfXmlMode = false;
ApplyToken(t);
@ -62,7 +81,7 @@ partial class ExpressionFinder { @@ -62,7 +81,7 @@ partial class ExpressionFinder {
public void Advance()
{
Console.WriteLine("Advance");
InformToken(null);
InformTokenInternal(null);
}
static readonly bool[,] set = {

49
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/XmlModeLexerTests.cs

@ -663,6 +663,55 @@ End Try"; @@ -663,6 +663,55 @@ End Try";
CheckFoot(lexer);
}
[Test]
public void BranchStatements()
{
string statement = @"GoTo 5
GoTo LabelName
Exit Do
Exit For
Exit While
Exit Select
Exit Sub
Exit Function
Exit Property
Exit Try
Continue Do
Continue For
Continue While
Stop
End
Return
Return 5
Return <Test />";
ILexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.GoTo, Tokens.LiteralInteger, Tokens.EOL,
Tokens.GoTo, Tokens.Identifier, Tokens.EOL,
Tokens.Exit, Tokens.Do, Tokens.EOL,
Tokens.Exit, Tokens.For, Tokens.EOL,
Tokens.Exit, Tokens.While, Tokens.EOL,
Tokens.Exit, Tokens.Select, Tokens.EOL,
Tokens.Exit, Tokens.Sub, Tokens.EOL,
Tokens.Exit, Tokens.Function, Tokens.EOL,
Tokens.Exit, Tokens.Property, Tokens.EOL,
Tokens.Exit, Tokens.Try, Tokens.EOL,
Tokens.Continue, Tokens.Do, Tokens.EOL,
Tokens.Continue, Tokens.For, Tokens.EOL,
Tokens.Continue, Tokens.While, Tokens.EOL,
Tokens.Stop, Tokens.EOL,
Tokens.End, Tokens.EOL,
Tokens.Return, Tokens.EOL,
Tokens.Return, Tokens.LiteralInteger, Tokens.EOL,
Tokens.Return, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement
);
CheckFoot(lexer);
}
#endregion
#region Helpers

Loading…
Cancel
Save