1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Web.Razor.Parser.SyntaxTree;
using System.Web.Razor.Text;
using System.Web.Razor.Tokenizer;
using System.Web.Razor.Tokenizer.Symbols;
namespace System.Web.Razor.Parser
{
[SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes", Justification = "All generic type parameters are required")]
public abstract class LanguageCharacteristics<TTokenizer, TSymbol, TSymbolType>
where TTokenizer : Tokenizer<TSymbol, TSymbolType>
where TSymbol : SymbolBase<TSymbolType>
{
public abstract string GetSample(TSymbolType type);
public abstract TTokenizer CreateTokenizer(ITextDocument source);
public abstract TSymbolType FlipBracket(TSymbolType bracket);
public abstract TSymbol CreateMarkerSymbol(SourceLocation location);
public virtual IEnumerable<TSymbol> TokenizeString(string content)
{
return TokenizeString(SourceLocation.Zero, content);
}
public virtual IEnumerable<TSymbol> TokenizeString(SourceLocation start, string input)
{
using (SeekableTextReader reader = new SeekableTextReader(input))
{
TTokenizer tok = CreateTokenizer(reader);
TSymbol sym;
while ((sym = tok.NextSymbol()) != null)
{
sym.OffsetStart(start);
yield return sym;
}
}
}
public virtual bool IsWhiteSpace(TSymbol symbol)
{
return IsKnownSymbolType(symbol, KnownSymbolType.WhiteSpace);
}
public virtual bool IsNewLine(TSymbol symbol)
{
return IsKnownSymbolType(symbol, KnownSymbolType.NewLine);
}
public virtual bool IsIdentifier(TSymbol symbol)
{
return IsKnownSymbolType(symbol, KnownSymbolType.Identifier);
}
public virtual bool IsKeyword(TSymbol symbol)
{
return IsKnownSymbolType(symbol, KnownSymbolType.Keyword);
}
public virtual bool IsTransition(TSymbol symbol)
{
return IsKnownSymbolType(symbol, KnownSymbolType.Transition);
}
public virtual bool IsCommentStart(TSymbol symbol)
{
return IsKnownSymbolType(symbol, KnownSymbolType.CommentStart);
}
public virtual bool IsCommentStar(TSymbol symbol)
{
return IsKnownSymbolType(symbol, KnownSymbolType.CommentStar);
}
public virtual bool IsCommentBody(TSymbol symbol)
{
return IsKnownSymbolType(symbol, KnownSymbolType.CommentBody);
}
public virtual bool IsUnknown(TSymbol symbol)
{
return IsKnownSymbolType(symbol, KnownSymbolType.Unknown);
}
public virtual bool IsKnownSymbolType(TSymbol symbol, KnownSymbolType type)
{
return symbol != null && Equals(symbol.Type, GetKnownSymbolType(type));
}
public virtual Tuple<TSymbol, TSymbol> SplitSymbol(TSymbol symbol, int splitAt, TSymbolType leftType)
{
TSymbol left = CreateSymbol(symbol.Start, symbol.Content.Substring(0, splitAt), leftType, Enumerable.Empty<RazorError>());
TSymbol right = null;
if (splitAt < symbol.Content.Length)
{
right = CreateSymbol(SourceLocationTracker.CalculateNewLocation(symbol.Start, left.Content), symbol.Content.Substring(splitAt), symbol.Type, symbol.Errors);
}
return Tuple.Create(left, right);
}
public abstract TSymbolType GetKnownSymbolType(KnownSymbolType type);
public virtual bool KnowsSymbolType(KnownSymbolType type)
{
return type == KnownSymbolType.Unknown || !Equals(GetKnownSymbolType(type), GetKnownSymbolType(KnownSymbolType.Unknown));
}
protected abstract TSymbol CreateSymbol(SourceLocation location, string content, TSymbolType type, IEnumerable<RazorError> errors);
}
}
|