Browse Source

Implemented nested XML content parsing

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@5903 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
1fa534a080
  1. 4
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/KeywordList.txt
  2. 40
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs
  3. 436
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Tokens.cs
  4. 20
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.atg
  5. 1537
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Parser.cs
  6. 30
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/ParserTests.cs
  7. 257
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/XmlModeLexerTests.cs
  8. 4
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG
  9. 7
      src/Libraries/NRefactory/Test/Lexer/VBNet/LexerTests.cs

4
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/KeywordList.txt

@ -27,6 +27,9 @@ XmlStartInlineVB @@ -27,6 +27,9 @@ XmlStartInlineVB
XmlEndInlineVB
XmlCloseTagEmptyElement
XmlOpenEndTag
XmlContent
XmlComment
XmlCData
# SPECIAL_CHARACTERS
Assign = "="
@ -69,6 +72,7 @@ DivIntegerAssign = "\\=" @@ -69,6 +72,7 @@ DivIntegerAssign = "\\="
ShiftLeftAssign = "<<="
ShiftRightAssign = ">>="
ConcatStringAssign = "&="
ColonAssign = ":="
# keywords according to the spec:
# Keywordlist

40
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs

@ -55,7 +55,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -55,7 +55,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
}
bool misreadExclamationMarkAsTypeCharacter;
bool inXmlMode, expectXmlIdentifier, inXmlTag, inXmlCloseTag;
bool inXmlMode, inXmlTag, inXmlCloseTag;
int level = 0;
Token NextInternal()
@ -94,11 +94,13 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -94,11 +94,13 @@ namespace ICSharpCode.NRefactory.Parser.VB
ReaderRead();
return new Token(Tokens.XmlStartInlineVB, Col - 1, Line);
}
level++;
inXmlTag = true;
return new Token(Tokens.XmlOpenTag, Col - 1, Line);
case '/':
if (ReaderPeek() == '>') {
ReaderRead();
inXmlTag = false;
level--;
return new Token(Tokens.XmlCloseTagEmptyElement, Col - 1, Line);
}
@ -113,6 +115,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -113,6 +115,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
case '>':
if (inXmlCloseTag)
level--;
inXmlTag = inXmlCloseTag = false;
return new Token(Tokens.XmlCloseTag, Col - 1, Line);
case '=':
return new Token(Tokens.Assign, Col - 1, Line);
@ -121,12 +124,16 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -121,12 +124,16 @@ namespace ICSharpCode.NRefactory.Parser.VB
int x = Col - 1;
int y = Line;
string s = ReadXmlString(ch);
return new Token(Tokens.LiteralString, Col - 1, Line, '"' + s + '"', s, LiteralFormat.StringLiteral);
return new Token(Tokens.LiteralString, Col - 1, Line, ch + s + ch, s, LiteralFormat.StringLiteral);
default:
// TODO : can be either identifier or xml content
if (XmlConvert.IsWhitespaceChar(ch))
continue;
return new Token(Tokens.Identifier, Col - 1, Line, ReadXmlIdent(ch));
if (inXmlCloseTag || inXmlTag) {
if (XmlConvert.IsWhitespaceChar(ch))
continue;
return new Token(Tokens.Identifier, Col - 1, Line, ReadXmlIdent(ch));
} else {
return new Token(Tokens.XmlContent, Col - 1, Line, ReadXmlContent(ch));
}
}
} else {
if (Char.IsWhiteSpace(ch)) {
@ -307,6 +314,20 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -307,6 +314,20 @@ namespace ICSharpCode.NRefactory.Parser.VB
}
}
string ReadXmlContent(char ch)
{
sb.Length = 0;
sb.Append(ch);
int nextChar;
while ((nextChar = ReaderRead()) != -1) {
ch = (char)nextChar;
sb.Append(ch);
if (ReaderPeek() == '<')
break;
}
return sb.ToString();
}
protected override Token Next()
{
Token t = NextInternal();
@ -662,12 +683,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -662,12 +683,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
while ((nextChar = ReaderRead()) != -1) {
ch = (char)nextChar;
if (ch == terminator) {
if (ReaderPeek() != -1 && ReaderPeek() == terminator) {
sb.Append(terminator);
ReaderRead();
} else {
break;
}
break;
} else if (ch == '\n') {
errors.Error(Line, Col, String.Format("No return allowed inside String literal"));
} else {

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

@ -23,225 +23,229 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -23,225 +23,229 @@ namespace ICSharpCode.NRefactory.Parser.VB
public const int XmlEndInlineVB = 13;
public const int XmlCloseTagEmptyElement = 14;
public const int XmlOpenEndTag = 15;
public const int XmlContent = 16;
public const int XmlComment = 17;
public const int XmlCData = 18;
// ----- special character -----
public const int Assign = 16;
public const int Colon = 17;
public const int Comma = 18;
public const int ConcatString = 19;
public const int Div = 20;
public const int DivInteger = 21;
public const int Dot = 22;
public const int ExclamationMark = 23;
public const int Minus = 24;
public const int Plus = 25;
public const int Power = 26;
public const int QuestionMark = 27;
public const int Times = 28;
public const int OpenCurlyBrace = 29;
public const int CloseCurlyBrace = 30;
public const int OpenParenthesis = 31;
public const int CloseParenthesis = 32;
public const int GreaterThan = 33;
public const int LessThan = 34;
public const int NotEqual = 35;
public const int GreaterEqual = 36;
public const int LessEqual = 37;
public const int ShiftLeft = 38;
public const int ShiftRight = 39;
public const int PlusAssign = 40;
public const int PowerAssign = 41;
public const int MinusAssign = 42;
public const int TimesAssign = 43;
public const int DivAssign = 44;
public const int DivIntegerAssign = 45;
public const int ShiftLeftAssign = 46;
public const int ShiftRightAssign = 47;
public const int ConcatStringAssign = 48;
public const int Assign = 19;
public const int Colon = 20;
public const int Comma = 21;
public const int ConcatString = 22;
public const int Div = 23;
public const int DivInteger = 24;
public const int Dot = 25;
public const int ExclamationMark = 26;
public const int Minus = 27;
public const int Plus = 28;
public const int Power = 29;
public const int QuestionMark = 30;
public const int Times = 31;
public const int OpenCurlyBrace = 32;
public const int CloseCurlyBrace = 33;
public const int OpenParenthesis = 34;
public const int CloseParenthesis = 35;
public const int GreaterThan = 36;
public const int LessThan = 37;
public const int NotEqual = 38;
public const int GreaterEqual = 39;
public const int LessEqual = 40;
public const int ShiftLeft = 41;
public const int ShiftRight = 42;
public const int PlusAssign = 43;
public const int PowerAssign = 44;
public const int MinusAssign = 45;
public const int TimesAssign = 46;
public const int DivAssign = 47;
public const int DivIntegerAssign = 48;
public const int ShiftLeftAssign = 49;
public const int ShiftRightAssign = 50;
public const int ConcatStringAssign = 51;
public const int ColonAssign = 52;
// ----- keywords -----
public const int AddHandler = 49;
public const int AddressOf = 50;
public const int Aggregate = 51;
public const int Alias = 52;
public const int And = 53;
public const int AndAlso = 54;
public const int Ansi = 55;
public const int As = 56;
public const int Ascending = 57;
public const int Assembly = 58;
public const int Auto = 59;
public const int Binary = 60;
public const int Boolean = 61;
public const int ByRef = 62;
public const int By = 63;
public const int Byte = 64;
public const int ByVal = 65;
public const int Call = 66;
public const int Case = 67;
public const int Catch = 68;
public const int CBool = 69;
public const int CByte = 70;
public const int CChar = 71;
public const int CDate = 72;
public const int CDbl = 73;
public const int CDec = 74;
public const int Char = 75;
public const int CInt = 76;
public const int Class = 77;
public const int CLng = 78;
public const int CObj = 79;
public const int Compare = 80;
public const int Const = 81;
public const int Continue = 82;
public const int CSByte = 83;
public const int CShort = 84;
public const int CSng = 85;
public const int CStr = 86;
public const int CType = 87;
public const int CUInt = 88;
public const int CULng = 89;
public const int CUShort = 90;
public const int Custom = 91;
public const int Date = 92;
public const int Decimal = 93;
public const int Declare = 94;
public const int Default = 95;
public const int Delegate = 96;
public const int Descending = 97;
public const int Dim = 98;
public const int DirectCast = 99;
public const int Distinct = 100;
public const int Do = 101;
public const int Double = 102;
public const int Each = 103;
public const int Else = 104;
public const int ElseIf = 105;
public const int End = 106;
public const int EndIf = 107;
public const int Enum = 108;
new public const int Equals = 109;
public const int Erase = 110;
public const int Error = 111;
public const int Event = 112;
public const int Exit = 113;
public const int Explicit = 114;
public const int False = 115;
public const int Finally = 116;
public const int For = 117;
public const int Friend = 118;
public const int From = 119;
public const int Function = 120;
public const int Get = 121;
new public const int GetType = 122;
public const int Global = 123;
public const int GoSub = 124;
public const int GoTo = 125;
public const int Group = 126;
public const int Handles = 127;
public const int If = 128;
public const int Implements = 129;
public const int Imports = 130;
public const int In = 131;
public const int Infer = 132;
public const int Inherits = 133;
public const int Integer = 134;
public const int Interface = 135;
public const int Into = 136;
public const int Is = 137;
public const int IsNot = 138;
public const int Join = 139;
public const int Key = 140;
public const int Let = 141;
public const int Lib = 142;
public const int Like = 143;
public const int Long = 144;
public const int Loop = 145;
public const int Me = 146;
public const int Mod = 147;
public const int Module = 148;
public const int MustInherit = 149;
public const int MustOverride = 150;
public const int MyBase = 151;
public const int MyClass = 152;
public const int Namespace = 153;
public const int Narrowing = 154;
public const int New = 155;
public const int Next = 156;
public const int Not = 157;
public const int Nothing = 158;
public const int NotInheritable = 159;
public const int NotOverridable = 160;
public const int Object = 161;
public const int Of = 162;
public const int Off = 163;
public const int On = 164;
public const int Operator = 165;
public const int Option = 166;
public const int Optional = 167;
public const int Or = 168;
public const int Order = 169;
public const int OrElse = 170;
public const int Overloads = 171;
public const int Overridable = 172;
public const int Overrides = 173;
public const int ParamArray = 174;
public const int Partial = 175;
public const int Preserve = 176;
public const int Private = 177;
public const int Property = 178;
public const int Protected = 179;
public const int Public = 180;
public const int RaiseEvent = 181;
public const int ReadOnly = 182;
public const int ReDim = 183;
public const int Rem = 184;
public const int RemoveHandler = 185;
public const int Resume = 186;
public const int Return = 187;
public const int SByte = 188;
public const int Select = 189;
public const int Set = 190;
public const int Shadows = 191;
public const int Shared = 192;
public const int Short = 193;
public const int Single = 194;
public const int Skip = 195;
public const int Static = 196;
public const int Step = 197;
public const int Stop = 198;
public const int Strict = 199;
public const int String = 200;
public const int Structure = 201;
public const int Sub = 202;
public const int SyncLock = 203;
public const int Take = 204;
public const int Text = 205;
public const int Then = 206;
public const int Throw = 207;
public const int To = 208;
public const int True = 209;
public const int Try = 210;
public const int TryCast = 211;
public const int TypeOf = 212;
public const int UInteger = 213;
public const int ULong = 214;
public const int Unicode = 215;
public const int Until = 216;
public const int UShort = 217;
public const int Using = 218;
public const int Variant = 219;
public const int Wend = 220;
public const int When = 221;
public const int Where = 222;
public const int While = 223;
public const int Widening = 224;
public const int With = 225;
public const int WithEvents = 226;
public const int WriteOnly = 227;
public const int Xor = 228;
public const int AddHandler = 53;
public const int AddressOf = 54;
public const int Aggregate = 55;
public const int Alias = 56;
public const int And = 57;
public const int AndAlso = 58;
public const int Ansi = 59;
public const int As = 60;
public const int Ascending = 61;
public const int Assembly = 62;
public const int Auto = 63;
public const int Binary = 64;
public const int Boolean = 65;
public const int ByRef = 66;
public const int By = 67;
public const int Byte = 68;
public const int ByVal = 69;
public const int Call = 70;
public const int Case = 71;
public const int Catch = 72;
public const int CBool = 73;
public const int CByte = 74;
public const int CChar = 75;
public const int CDate = 76;
public const int CDbl = 77;
public const int CDec = 78;
public const int Char = 79;
public const int CInt = 80;
public const int Class = 81;
public const int CLng = 82;
public const int CObj = 83;
public const int Compare = 84;
public const int Const = 85;
public const int Continue = 86;
public const int CSByte = 87;
public const int CShort = 88;
public const int CSng = 89;
public const int CStr = 90;
public const int CType = 91;
public const int CUInt = 92;
public const int CULng = 93;
public const int CUShort = 94;
public const int Custom = 95;
public const int Date = 96;
public const int Decimal = 97;
public const int Declare = 98;
public const int Default = 99;
public const int Delegate = 100;
public const int Descending = 101;
public const int Dim = 102;
public const int DirectCast = 103;
public const int Distinct = 104;
public const int Do = 105;
public const int Double = 106;
public const int Each = 107;
public const int Else = 108;
public const int ElseIf = 109;
public const int End = 110;
public const int EndIf = 111;
public const int Enum = 112;
new public const int Equals = 113;
public const int Erase = 114;
public const int Error = 115;
public const int Event = 116;
public const int Exit = 117;
public const int Explicit = 118;
public const int False = 119;
public const int Finally = 120;
public const int For = 121;
public const int Friend = 122;
public const int From = 123;
public const int Function = 124;
public const int Get = 125;
new public const int GetType = 126;
public const int Global = 127;
public const int GoSub = 128;
public const int GoTo = 129;
public const int Group = 130;
public const int Handles = 131;
public const int If = 132;
public const int Implements = 133;
public const int Imports = 134;
public const int In = 135;
public const int Infer = 136;
public const int Inherits = 137;
public const int Integer = 138;
public const int Interface = 139;
public const int Into = 140;
public const int Is = 141;
public const int IsNot = 142;
public const int Join = 143;
public const int Key = 144;
public const int Let = 145;
public const int Lib = 146;
public const int Like = 147;
public const int Long = 148;
public const int Loop = 149;
public const int Me = 150;
public const int Mod = 151;
public const int Module = 152;
public const int MustInherit = 153;
public const int MustOverride = 154;
public const int MyBase = 155;
public const int MyClass = 156;
public const int Namespace = 157;
public const int Narrowing = 158;
public const int New = 159;
public const int Next = 160;
public const int Not = 161;
public const int Nothing = 162;
public const int NotInheritable = 163;
public const int NotOverridable = 164;
public const int Object = 165;
public const int Of = 166;
public const int Off = 167;
public const int On = 168;
public const int Operator = 169;
public const int Option = 170;
public const int Optional = 171;
public const int Or = 172;
public const int Order = 173;
public const int OrElse = 174;
public const int Overloads = 175;
public const int Overridable = 176;
public const int Overrides = 177;
public const int ParamArray = 178;
public const int Partial = 179;
public const int Preserve = 180;
public const int Private = 181;
public const int Property = 182;
public const int Protected = 183;
public const int Public = 184;
public const int RaiseEvent = 185;
public const int ReadOnly = 186;
public const int ReDim = 187;
public const int Rem = 188;
public const int RemoveHandler = 189;
public const int Resume = 190;
public const int Return = 191;
public const int SByte = 192;
public const int Select = 193;
public const int Set = 194;
public const int Shadows = 195;
public const int Shared = 196;
public const int Short = 197;
public const int Single = 198;
public const int Skip = 199;
public const int Static = 200;
public const int Step = 201;
public const int Stop = 202;
public const int Strict = 203;
public const int String = 204;
public const int Structure = 205;
public const int Sub = 206;
public const int SyncLock = 207;
public const int Take = 208;
public const int Text = 209;
public const int Then = 210;
public const int Throw = 211;
public const int To = 212;
public const int True = 213;
public const int Try = 214;
public const int TryCast = 215;
public const int TypeOf = 216;
public const int UInteger = 217;
public const int ULong = 218;
public const int Unicode = 219;
public const int Until = 220;
public const int UShort = 221;
public const int Using = 222;
public const int Variant = 223;
public const int Wend = 224;
public const int When = 225;
public const int Where = 226;
public const int While = 227;
public const int Widening = 228;
public const int With = 229;
public const int WithEvents = 230;
public const int WriteOnly = 231;
public const int Xor = 232;
public const int MaxToken = 229;
public const int MaxToken = 233;
static BitArray NewSet(params int[] values)
{
BitArray bitArray = new BitArray(MaxToken);
@ -274,6 +278,9 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -274,6 +278,9 @@ namespace ICSharpCode.NRefactory.Parser.VB
"<XmlEndInlineVB>",
"<XmlCloseTagEmptyElement>",
"<XmlOpenEndTag>",
"<XmlContent>",
"<XmlComment>",
"<XmlCData>",
// ----- special character -----
"=",
":",
@ -308,6 +315,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -308,6 +315,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
"<<=",
">>=",
"&=",
":=",
// ----- keywords -----
"AddHandler",
"AddressOf",

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

@ -28,6 +28,9 @@ TOKENS @@ -28,6 +28,9 @@ TOKENS
XmlEndInlineVB
XmlCloseTagEmptyElement
XmlOpenEndTag
XmlContent
XmlComment
XmlCData
/* ----- special character ----- */
"="
@ -63,6 +66,7 @@ TOKENS @@ -63,6 +66,7 @@ TOKENS
"<<="
">>="
"&="
":="
/* ----- keywords ----- */
"AddHandler"
@ -340,7 +344,7 @@ Expression = @@ -340,7 +344,7 @@ Expression =
( Identifier [ "(" "Of" TypeName { "," TypeName } ")" ] ) |
( "AddressOf" Expression) |
( "<" (. PushContext(Context.Xml); .) ANY ">" (. PopContext(); .) )
( XmlOpenTag (. PushContext(Context.Xml); .) ANY ">" (. PopContext(); .) )
)
.
@ -388,7 +392,18 @@ Literal = @@ -388,7 +392,18 @@ Literal =
Statement =
( ( Identifier | LiteralInteger ) ":" ) |
( ( "Dim" | "Static" | "Const" ) Identifier [ "?" ] [ ( "(" { "," } ")" ) ] { "," Identifier [ "?" ] [ ( "(" { "," } ")" ) ] } [ "As" [ "New" ] TypeName [ "(" ")" ] ] [ "=" Expression ] )
( ( "Dim" | "Static" | "Const" ) Identifier [ "?" ] [ ( "(" { "," } ")" ) ] { "," Identifier [ "?" ] [ ( "(" { "," } ")" ) ] } [ "As" [ "New" ] TypeName [ "(" ")" ] ] [ "=" Expression ] ) |
( ( "With" | "SyncLock" ) Expression StatementTerminator Block "End" ( "With" | "SyncLock" ) ) |
( ( "AddHandler" | "RemoveHandler" ) Expression "," Expression ) |
( "RaiseEvent" IdentifierOrKeyword [ "(" [ ArgumentList ] ")" ] ) |
( Expression ( "=" | "^=" | "*=" | "/=" | "\\=" | "+=" | "-=" | "&=" | "<<=" | ">>=" ) [ EOL ] Expression ) |
/* ( "Mid" [ "$" ] "(" Expression "," Expression [ "," Expression ] ")" "=" Expression ) | */
( [ "Call" ] Expression [ "(" [ ArgumentList ] ")" ] ) |
( "If" Expression [ "Then" ] StatementTerminator ( Block | { Statement } ) )
.
ArgumentList =
Expression { "," Expression } [ "," IdentifierOrKeyword ":=" Expression { "," IdentifierOrKeyword ":=" Expression } ]
.
/* This production handles pseudo keywords that are needed in the grammar */
@ -421,6 +436,7 @@ IdentifierForFieldDeclaration = @@ -421,6 +436,7 @@ IdentifierForFieldDeclaration =
| "Infer"
| "Into"
| "Join"
| "Key"
| "Off"
| "Order"
| "Preserve"

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

File diff suppressed because it is too large Load Diff

30
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/ParserTests.cs

@ -183,6 +183,36 @@ exit Global @@ -183,6 +183,36 @@ exit Global
);
}
[Test]
public void WithBlockTest()
{
RunTest(
@"Class Test
Public Sub New()
With x
End With
End Sub
End Class
",
@"enter Global
enter Type
enter Member
enter IdentifierExpected
exit IdentifierExpected
enter Body
enter IdentifierExpected
exit IdentifierExpected
enter Body
exit Body
exit Body
exit Member
exit Type
exit Global
"
);
}
void RunTest(string code, string expectedOutput)
{
ExpressionFinder p = new ExpressionFinder();

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

@ -32,6 +32,263 @@ namespace VBParserExperiment @@ -32,6 +32,263 @@ namespace VBParserExperiment
"End Class";
}
[Test]
public void TagWithContent()
{
ILexer lexer = GenerateLexer(new StringReader(TestStatement("Dim x = <Test>Hello World</Test>")));
CheckHead(lexer);
Assert.AreEqual(Tokens.Dim, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Assign, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
CheckFoot(lexer);
}
[Test]
public void HtmlText()
{
ILexer lexer = GenerateLexer(new StringReader(TestStatement("Dim x = <div><h1>Title</h1>" +
"<p>test test <br /> test</p></div>")));
CheckHead(lexer);
Assert.AreEqual(Tokens.Dim, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Assign, lexer.NextToken().Kind);
// <div>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// <h1>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// Title
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// </h1>
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// <p>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// test test
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// <br />
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTagEmptyElement, lexer.NextToken().Kind);
// test
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// </p>
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// </div>
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
CheckFoot(lexer);
}
[Test]
public void XmlLiteralsExample1()
{
ILexer lexer = GenerateLexer(new StringReader(TestStatement("Dim xml = <menu>\n" +
" <course name=\"appetizer\">\n" +
" <dish>Shrimp Cocktail</dish>\n" +
" <dish>Escargot</dish>\n" +
" </course>\n" +
" <course name=\"main\">\n" +
" <dish>Filet Mignon</dish>\n" +
" <dish>Garlic Potatoes</dish>\n" +
" <dish>Broccoli</dish>\n" +
" </course>\n" +
" <course name=\"dessert\">\n" +
" <dish>Chocolate Cheesecake</dish>\n" +
" </course>\n" +
" </menu>")));
CheckHead(lexer);
Assert.AreEqual(Tokens.Dim, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Assign, lexer.NextToken().Kind);
#region <menu>
// <menu>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
#region <course>
// <course name=\"appetizer\">
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Assign, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.LiteralString, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// <dish>Shrimp Cocktail</dish>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// <dish>Escargot</dish>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// </course>
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
#endregion
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
#region <course>
// <course name=\"main\">
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Assign, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.LiteralString, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// <dish>Filet Mignon</dish>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// <dish>Garlic Potatoes</dish>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// <dish>Broccoli</dish>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// </course>
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
#endregion
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
#region <course>
// <course name=\"dessert\">
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Assign, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.LiteralString, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// <dish>Chocolate Cheesecake</dish>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// </course>
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
#endregion
// whitespaces
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// </menu>
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
#endregion
CheckFoot(lexer);
}
[Test]
public void SimpleEmptyTag()
{

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

@ -27,6 +27,9 @@ TOKENS @@ -27,6 +27,9 @@ TOKENS
XmlEndInlineVB
XmlCloseTagEmptyElement
XmlOpenEndTag
XmlContent
XmlComment
XmlCData
/* ----- special character ----- */
"="
@ -62,6 +65,7 @@ TOKENS @@ -62,6 +65,7 @@ TOKENS
"<<="
">>="
"&="
":="
/* ----- keywords ----- */
"AddHandler"

7
src/Libraries/NRefactory/Test/Lexer/VBNet/LexerTests.cs

@ -247,6 +247,13 @@ namespace ICSharpCode.NRefactory.Tests.Lexer.VB @@ -247,6 +247,13 @@ namespace ICSharpCode.NRefactory.Tests.Lexer.VB
Assert.AreEqual(Tokens.ConcatStringAssign, lexer.NextToken().Kind);
}
[Test]
public void TestColonAssign()
{
ILexer lexer = GenerateLexer(new StringReader(":="));
Assert.AreEqual(Tokens.ColonAssign, lexer.NextToken().Kind);
}
[Test]
public void TestAddHandler()
{

Loading…
Cancel
Save