private void SubstituteValues(string path, Token <ParserTokenType> token) { bool processed = false; string updatedValue = token.Value; if (!String.IsNullOrEmpty(updatedValue)) { int replaceCount = 0; Regex.Match m = FrontendCompiler.ParseSubsitutions.Match(updatedValue); while (m.Success) { processed = true; // found a substitution. // This is an arbitrary upper limit for variable replacements to prevent // inifite loops. if (replaceCount > 2000) { this.OnMessage(new CompilerMessageEventArgs(CompilerMessage.InfiniteLoopInSubsitution(updatedValue), path, token.Range.Start.Line, token.Range.Start.Column, token.Range.End.Column)); return; } string beginning = updatedValue.Substring(0, m.Index); string variableName = updatedValue.Substring(m.Index + 2, m.Length - 3); string end = updatedValue.Substring(m.Index + m.Length); string variableValue; if (!this.Substitutions.TryGetValue(variableName, out variableValue)) { this.OnMessage(new CompilerMessageEventArgs(CompilerMessage.UnknownSubstitution(variableName), path, token.Range.Start.Line, token.Range.Start.Column, token.Range.End.Column)); return; } updatedValue = String.Concat(beginning, variableValue, end); m = FrontendCompiler.ParseSubsitutions.Match(updatedValue); } } if (processed) { token.UpdateValue(updatedValue); } }