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

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

@ -46,7 +46,7 @@ namespace ICSharpCode.NRefactory.Parser.VBNet.Experimental
void ApplyToken(Token token) void ApplyToken(Token token)
{ {
//Console.WriteLine(token); Console.WriteLine(token);
if (stack.Count == 0 || token == null) if (stack.Count == 0 || token == null)
return; 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 {
public void Advance() public void Advance()
{ {
//Console.WriteLine("Advance"); Console.WriteLine("Advance");
InformToken(null); InformToken(null);
} }

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

@ -440,6 +440,62 @@ namespace DefaultNamespace
CheckFoot(lexer); 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 #endregion
#region Helpers #region Helpers

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

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

Loading…
Cancel
Save