Beispiel #1
0
        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);
            }
        }