14 using System.Collections.Generic;
18 #region About compound terminals
45 #region Nested classes
68 return (
Flags & flag) != 0;
70 public string Text {
get {
return Prefix + Body + Suffix; } }
75 #region constructors and initialization
79 Escapes = GetDefaultEscapes();
83 PrefixFlags.Add(prefix,
flags);
86 public void AddSuffix(
string suffix, params TypeCode[] typeCodes) {
87 SuffixTypeCodes.Add(suffix, typeCodes);
92 #region public Properties/Fields
93 public Char EscapeChar =
'\\';
98 #region private fields
104 string _prefixesFirsts;
105 string _suffixesFirsts;
109 #region overrides: Init, TryMatch
111 base.Init(grammarData);
113 Prefixes.Sort(StringList.LongerFirst);
114 _prefixesFirsts = string.Empty;
115 foreach (
string pfx
in Prefixes)
116 _prefixesFirsts += pfx[0];
118 Suffixes.Sort(StringList.LongerFirst);
119 _suffixesFirsts = string.Empty;
120 foreach (
string sfx
in Suffixes)
121 _suffixesFirsts += sfx[0];
122 if (!CaseSensitive) {
123 _prefixesFirsts = _prefixesFirsts.ToLower() + _prefixesFirsts.ToUpper();
124 _suffixesFirsts = _suffixesFirsts.ToLower() + _suffixesFirsts.ToUpper();
136 token = QuickParse(context, source);
137 if (token != null)
return token;
138 source.PreviewPosition = source.Location.Position;
142 InitDetails(context, details);
145 ReadPrefix(source, details);
146 if (!ReadBody(source, details))
148 if (details.
Error != null)
149 return source.CreateErrorToken(details.Error);
151 details.Value = details.Body;
153 ReadSuffix(source, details);
155 if(!ConvertValue(details)) {
156 if (
string.IsNullOrEmpty(details.
Error))
158 return source.CreateErrorToken(details.Error);
161 token = CreateToken(context, source, details);
165 context.VsLineScanState.TokenSubType = (byte)details.
SubTypeIndex;
167 context.VsLineScanState.TerminalIndex = this.MultilineIndex;
169 context.VsLineScanState.Value = 0;
174 var token = source.CreateToken(this.OutputTerminal, details.Value);
175 token.Details = details;
177 token.Flags |= TokenFlags.IsIncomplete;
182 details.PartialOk = (context.Mode == ParseMode.VsLineScan);
183 details.PartialContinues = (context.VsLineScanState.Value != 0);
191 if (_prefixesFirsts.IndexOf(source.
PreviewChar) < 0)
193 foreach (
string pfx
in Prefixes) {
194 if (!source.MatchSymbol(pfx, !CaseSensitive))
continue;
196 details.Prefix = pfx;
197 source.PreviewPosition += pfx.Length;
200 if (!
string.IsNullOrEmpty(details.Prefix) && PrefixFlags.TryGetValue(details.Prefix, out pfxFlags))
201 details.Flags |= (short) pfxFlags;
211 if (_suffixesFirsts.IndexOf(source.
PreviewChar) < 0)
return;
212 foreach (
string sfx
in Suffixes) {
213 if (!source.MatchSymbol(sfx, !CaseSensitive))
continue;
215 details.Suffix = sfx;
216 source.PreviewPosition += sfx.Length;
219 if (!
string.IsNullOrEmpty(details.Suffix) && SuffixTypeCodes.TryGetValue(details.Suffix, out codes))
220 details.TypeCodes = codes;
226 details.Value = details.Body;
233 #region utils: GetDefaultEscapes
236 escapes.Add(
'a',
"\u0007");
237 escapes.Add(
'b',
"\b");
238 escapes.Add(
't',
"\t");
239 escapes.Add(
'n',
"\n");
240 escapes.Add(
'v',
"\v");
241 escapes.Add(
'f',
"\f");
242 escapes.Add(
'r',
"\r");
243 escapes.Add(
'"',
"\"");
244 escapes.Add(
'\'',
"\'");
245 escapes.Add(
'\\',
"\\");
246 escapes.Add(
' ',
" ");
247 escapes.Add(
'\n',
"\n");
virtual void InitDetails(ParsingContext context, CompoundTokenDetails details)
virtual bool ReadBody(ISourceStream source, CompoundTokenDetails details)
char PreviewChar
Gets a char at preview position
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ DXGI_FORMAT _In_ DWORD flags
virtual Token CreateToken(ParsingContext context, ISourceStream source, CompoundTokenDetails details)
void AddSuffix(string suffix, params TypeCode[] typeCodes)
Interface for Terminals to access the source stream and produce tokens.
Flags
Enumeration of the new Assimp's flags.
virtual bool ConvertValue(CompoundTokenDetails details)
static EscapeTable GetDefaultEscapes()
void AddPrefixFlag(string prefix, short flags)
virtual void ReadSuffix(ISourceStream source, CompoundTokenDetails details)
override IList< string > GetFirsts()
CompoundTerminalBase(string name, TermFlags flags)
static string ErrInvNumber
Looks up a localized string similar to Invalid number..
virtual Token QuickParse(ParsingContext context, ISourceStream source)
VsScannerStateMap VsLineScanState
virtual void ReadPrefix(ISourceStream source, CompoundTokenDetails details)
CompoundTerminalBase(string name)
override void Init(GrammarData grammarData)
override Token TryMatch(ParsingContext context, ISourceStream source)
Tokens are produced by scanner and fed to parser, optionally passing through Token filters in between...