Esempio n. 1
0
 public Template(IParsingResultExtended name, TemplateArgs arguments)
 {
     Name      = name;
     Arguments = arguments;
 }
Esempio n. 2
0
        public static IParsingResultExtended Parse(ParsingContext context)
        {
            RewindState            rewind = context.RewindState;
            IParsingResultExtended result = null;
            bool isResultTemplatePrefix   = false;

            while (!context.Parser.IsEnd)
            {
                bool isResultTemplatePrefixNext = false;

                switch (context.Parser.Peek)
                {
                case 'S':
                {
                    IParsingResultExtended substitution = Substitution.Parse(context);

                    if (substitution == null)
                    {
                        context.Rewind(rewind);
                        return(null);
                    }

                    result = substitution;
                }
                break;

                case 'T':
                {
                    IParsingResultExtended param = TemplateParam.Parse(context);

                    if (param == null)
                    {
                        context.Rewind(rewind);
                        return(null);
                    }

                    result = AddToSubstitutionTable(context, param);
                    isResultTemplatePrefixNext = true;
                }
                break;

                case 'D':
                {
                    IParsingResultExtended decltype = Decltype.Parse(context);

                    if (decltype != null)
                    {
                        result = AddToSubstitutionTable(context, decltype);
                    }
                    else
                    {
                        IParsingResultExtended name = UnqualifiedName.Parse(context);

                        if (name == null)
                        {
                            context.Rewind(rewind);
                            return(null);
                        }

                        if (result != null)
                        {
                            result = AddToSubstitutionTable(context, new NestedName(result, name));
                        }
                        else
                        {
                            result = AddToSubstitutionTable(context, name);
                        }
                        isResultTemplatePrefixNext = true;
                    }
                }
                break;

                default:
                    if (context.Parser.Peek == 'I' && result != null && isResultTemplatePrefix)
                    {
                        TemplateArgs arguments = TemplateArgs.Parse(context);

                        if (arguments == null)
                        {
                            context.Rewind(rewind);
                            return(null);
                        }

                        result = AddToSubstitutionTable(context, new Template(result, arguments));
                    }
                    else if (result != null && SourceName.StartsWith(context))
                    {
                        Debug.Assert(UnqualifiedName.StartsWith(context));
                        Debug.Assert(DataMemberPrefix.StartsWith(context));

                        IParsingResultExtended name = SourceName.Parse(context);

                        if (name == null)
                        {
                            context.Rewind(rewind);
                            return(null);
                        }

                        if (context.Parser.VerifyString("M"))
                        {
                            result = AddToSubstitutionTable(context, new DataMember(result, name));
                        }
                        else
                        {
                            if (result != null)
                            {
                                result = AddToSubstitutionTable(context, new NestedName(result, name));
                            }
                            else
                            {
                                result = AddToSubstitutionTable(context, name);
                            }
                            isResultTemplatePrefixNext = true;
                        }
                    }
                    else if (UnqualifiedName.StartsWith(context))
                    {
                        IParsingResultExtended name = UnqualifiedName.Parse(context);

                        if (name == null)
                        {
                            context.Rewind(rewind);
                            return(null);
                        }

                        if (result != null)
                        {
                            result = AddToSubstitutionTable(context, new NestedName(result, name));
                        }
                        else
                        {
                            result = AddToSubstitutionTable(context, name);
                        }
                        isResultTemplatePrefixNext = true;
                    }
                    else
                    {
                        if (result != null)
                        {
                            return(result);
                        }

                        context.Rewind(rewind);
                        return(null);
                    }
                    break;
                }
                isResultTemplatePrefix = isResultTemplatePrefixNext;
            }

            return(result);
        }