Browse Source

- fixed some XML-mode detection errors in ForLoopStatement

- reimplemented parsing of Key in MemberInitializer
- added ErrorHandlingStatement
- added further unit tests

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@5975 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
bbf0ec884a
  1. 12
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.atg
  2. 2
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.cs
  3. 1177
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Parser.cs
  4. 2
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/PushParser.frame
  5. 56
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/XmlModeLexerTests.cs
  6. 3
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG

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

@ -520,6 +520,7 @@ Statement = @@ -520,6 +520,7 @@ Statement =
| WhileStatement
| DoLoopStatement
| ForStatement
| ErrorHandlingStatement
| InvocationStatement
.
@ -597,25 +598,30 @@ DoBottomLoopStatement = @@ -597,25 +598,30 @@ DoBottomLoopStatement =
.
ForStatement =
"For" ( ForLoopStatement | ForEachLoopStatement )
"For" (. nextTokenIsPotentialStartOfXmlMode = true; .) ( ForLoopStatement | ForEachLoopStatement )
.
ForLoopStatement =
ForLoopVariable "=" Expression /* "To" is binary operator */ [ "Step" Expression ]
StatementTerminatorAndBlock
"Next" [ Expression { "," Expression } ]
"Next" (. nextTokenIsPotentialStartOfXmlMode = true; .) [ Expression { "," Expression } ]
.
ForEachLoopStatement =
"Each" ForLoopVariable "In" Expression
StatementTerminatorAndBlock
"Next" [ Expression { "," Expression } ]
"Next" (. nextTokenIsPotentialStartOfXmlMode = true; .) [ Expression { "," Expression } ]
.
ForLoopVariable =
SimpleExpression [ "?" ] { ExpressionSuffix }
.
ErrorHandlingStatement =
[ "On" ] "Error" (. nextTokenIsPotentialStartOfXmlMode = true; .) ( Expression | "GoTo" ( LiteralInteger | Identifier ) | "Resume" "Next" )
| "Resume" ( "Next" | LiteralInteger | Identifier )
.
InvocationStatement =
[ "Call" ] Expression
.

2
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.cs

@ -46,7 +46,7 @@ namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental @@ -46,7 +46,7 @@ namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental
void ApplyToken(Token token)
{
//Console.WriteLine(token);
Console.WriteLine(token);
if (stack.Count == 0 || token == null)
return;

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

File diff suppressed because it is too large Load Diff

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

@ -61,7 +61,7 @@ partial class ExpressionFinder { @@ -61,7 +61,7 @@ partial class ExpressionFinder {
public void Advance()
{
//Console.WriteLine("Advance");
Console.WriteLine("Advance");
InformToken(null);
}

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

@ -440,6 +440,62 @@ namespace DefaultNamespace @@ -440,6 +440,62 @@ namespace DefaultNamespace
CheckFoot(lexer);
}
[Test]
public void ErrorHandlingStatement()
{
ILexer lexer = GenerateLexer(new StringReader(TestStatement("On Error Resume Next\n" +
"On Error GoTo -1\n" +
"On Error GoTo 0\n" +
"On Error GoTo Test\n" +
"Error 5\n" +
"Error <Test />\n" +
"Resume Next\n" +
"Resume Label\n" +
"Resume 4")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.On, Tokens.Error, Tokens.Resume, Tokens.Next, Tokens.EOL,
Tokens.On, Tokens.Error, Tokens.GoTo, Tokens.Minus, Tokens.LiteralInteger, Tokens.EOL,
Tokens.On, Tokens.Error, Tokens.GoTo, Tokens.LiteralInteger, Tokens.EOL,
Tokens.On, Tokens.Error, Tokens.GoTo, Tokens.Identifier, Tokens.EOL,
Tokens.Error, Tokens.LiteralInteger, Tokens.EOL,
Tokens.Error, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Resume, Tokens.Next, Tokens.EOL,
Tokens.Resume, Tokens.Identifier, Tokens.EOL,
Tokens.Resume, Tokens.LiteralInteger
);
CheckFoot(lexer);
}
[Test]
public void ForLoopStatement()
{
string statement = @"For <Test /> = <Test /> To <Test /> Step <Test />
Next <Test />, <Test />
For Each <Test /> In <Test />
Next <Test />";
ILexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.For, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement,
Tokens.Assign, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement,
Tokens.To, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement,
Tokens.Step, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Next, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Comma,
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.For, Tokens.Each, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement,
Tokens.In, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Next, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement
);
CheckFoot(lexer);
}
#endregion
#region Helpers

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

@ -2456,7 +2456,7 @@ MemberInitializer<out MemberInitializerExpression memberInitializer> @@ -2456,7 +2456,7 @@ MemberInitializer<out MemberInitializerExpression memberInitializer>
bool isKey = false;
string name = null;
.) =
/*[ "Key" (. isKey = true; .) ]*/
[ "Key" (. isKey = true; .) ]
"." IdentifierOrKeyword<out name> "=" Expr<out initExpr>
(.
memberInitializer.Name = name;
@ -3441,6 +3441,7 @@ IdentifierForFieldDeclaration = @@ -3441,6 +3441,7 @@ IdentifierForFieldDeclaration =
| "Infer"
| "Into"
| "Join"
| "Key"
| "Off"
| "Order"
| "Preserve"

Loading…
Cancel
Save