14 using System.Collections.Generic;
17 using System.Text.RegularExpressions;
41 public Char StartSymbol =
'/';
42 public Char EndSymbol=
'/';
43 public Char EscapeSymbol=
'\\';
45 public RegexOptions DefaultOptions = RegexOptions.None;
48 private char[] _stopChars;
51 Switches.Add(
'i', RegexOptions.IgnoreCase);
52 Switches.Add(
'g', RegexOptions.None);
53 Switches.Add(
'm', RegexOptions.Multiline);
54 base.SetFlag(TermFlags.IsLiteral);
57 public RegExLiteral(
string name,
char startEndSymbol,
char escapeSymbol) : base(name) {
58 StartSymbol = startEndSymbol;
59 EndSymbol = startEndSymbol;
60 EscapeSymbol = escapeSymbol;
64 base.Init(grammarData);
65 _stopChars =
new char[] { EndSymbol,
'\r',
'\n' };
69 result.Add(StartSymbol.ToString());
76 var newPos = source.Text.IndexOfAny(_stopChars, source.PreviewPosition + 1);
80 source.PreviewPosition = newPos;
84 if (!CheckEscaped(source))
87 source.PreviewPosition++;
89 var patternLen = source.PreviewPosition - source.Location.Position - 2;
91 RegexOptions options = RegexOptions.None;
92 var switches = string.Empty;
93 while(ReadSwitch(source, ref options)) {
94 if (IsSet(
RegexTermOptions.UniqueSwitches) && switches.Contains(source.PreviewChar))
96 switches += source.PreviewChar.ToString();
97 source.PreviewPosition++;
101 var currChar = source.PreviewChar;
102 if (
char.IsLetter(currChar) || currChar ==
'_')
105 var token = source.CreateToken(this.OutputTerminal);
107 string pattern = token.Text.Substring(1, patternLen);
108 object value = pattern;
110 value =
new Regex(pattern, options);
113 token.Details = switches;
118 var savePos = source.PreviewPosition;
119 bool escaped =
false;
120 source.PreviewPosition--;
123 source.PreviewPosition--;
125 source.PreviewPosition = savePos;
128 private bool ReadSwitch(ISourceStream source, ref RegexOptions options) {
130 var result = Switches.TryGetValue(source.PreviewChar, out option);
137 return (Options & option) != 0;
bool IsSet(RegexTermOptions option)
override void Init(GrammarData grammarData)
char PreviewChar
Gets a char at preview position
A strongly-typed resource class, for looking up localized strings, etc.
static string ErrNoEndForRegex
Looks up a localized string similar to No end symbol for regex literal..
Interface for Terminals to access the source stream and produce tokens.
Flags
Enumeration of the new Assimp's flags.
static string ErrInvRegexSwitch
Looks up a localized string similar to Invalid switch '{0}' for regular expression.
override IList< string > GetFirsts()
RegExLiteral(string name)
static string ErrDupRegexSwitch
Looks up a localized string similar to Duplicate switch '{0}' for regular expression..
Tokens are produced by scanner and fed to parser, optionally passing through Token filters in between...
override Token TryMatch(ParsingContext context, ISourceStream source)
RegExLiteral(string name, char startEndSymbol, char escapeSymbol)
Token CreateErrorToken(string message, params object[] args)
Creates error token with custom error message as its Value.