Esempio n. 1
0
        /// <summary>
        /// selection = elements, {'|', elements} ;
        /// </summary>
        /// <param name="elements">elements</param>
        /// <param name="repetition">{'|', elements}</param>
        protected override SelectionElement ReturnSelection(ElementsElement elements, FixedList <GeneratorLexElement, ElementsElement>[] repetition)
        {
            List <ElementsElement> list = new List <ElementsElement>();

            list.Add(elements);
            list.AddRange(repetition.Select(p => p.Element2));
            return(new SelectionElement(list));
        }
        void firstFollowing(ScriptParserGenerator gen, DefinitionElement root, TextWriter writer, DefinitionContent content)
        {
            writer.WriteLine(string.Format("   {0}: first:<{1}> following:<{2}>", content, joinStr(content.GetFirstTerminals(gen)), joinStr(content.GetFollowingTerminals(gen))));
            SelectionElement s = content as SelectionElement;

            if (s != null)
            {
                foreach (ElementsElement elems in s.Candidates)
                {
                    firstFollowing(gen, root, writer, elems);
                }
            }
            ExpressionsElement ex = content as ExpressionsElement;

            if (ex != null)
            {
                foreach (ElementsElement elems in ex.Selection.Candidates)
                {
                    firstFollowing(gen, root, writer, elems);
                }
            }
            ElementsElement es = content as ElementsElement;

            if (es != null)
            {
                foreach (ElementElement elem in es.Elements)
                {
                    firstFollowing(gen, root, writer, elem);
                }
            }
            RepeatElement r = content as RepeatElement;

            if (r != null)
            {
                firstFollowing(gen, root, writer, r.InnerExpression);
            }
            OptionElement o = content as OptionElement;

            if (o != null)
            {
                firstFollowing(gen, root, writer, o.InnerExpression);
            }
            GroupElement g = content as GroupElement;

            if (g != null)
            {
                firstFollowing(gen, root, writer, g.InnerExpression);
            }
            LiteralElement l = content as LiteralElement;
        }
        public int GetHashCode(DefinitionContent obj)
        {
            SelectionElement s = obj as SelectionElement;

            if (s != null)
            {
                // ハッシュ値計算できないので適当
                return(15773);
            }
            ExpressionsElement ex = obj as ExpressionsElement;

            if (ex != null)
            {
                return(this.GetHashCode(ex.Selection));
            }
            ElementsElement es = obj as ElementsElement;

            if (es != null)
            {
                return(es.Elements.Sum(e => this.GetHashCode(e)));
            }
            RepeatElement r = obj as RepeatElement;

            if (r != null)
            {
                return(1744579 + this.GetHashCode(r.InnerExpression));
            }
            OptionElement o = obj as OptionElement;

            if (o != null)
            {
                return(3234551 + this.GetHashCode(o.InnerExpression));
            }
            GroupElement g = obj as GroupElement;

            if (g != null)
            {
                return(this.GetHashCode(g.InnerExpression));
            }
            LiteralElement l = obj as LiteralElement;

            if (l != null)
            {
                return(l.InnerWord.GetHashCode() + l.Literal.Type.GetHashCode());
            }
            Debug.Assert(false);
            return(7);
        }
        protected SelectionElement ParseSelection()
        {
            ElementsElement var1 = this.ParseElements();
            List <FixedList <GeneratorLexElement, ElementsElement> > var2 = new List <FixedList <GeneratorLexElement, ElementsElement> >();

            for (Optional <GeneratorLexElement> var3 = _Reader.Peek(); var3.HasValue && (var3.Value.Type == GeneratorLexType.VSlash); var3 = _Reader.Peek())
            {
                FixedList <GeneratorLexElement, ElementsElement> var4 = default(FixedList <GeneratorLexElement, ElementsElement>);
                GeneratorLexElement var5 = _Reader.ReadOrThrow("selection", GeneratorLexType.VSlash);
                ElementsElement     var6 = this.ParseElements();
                FixedList <GeneratorLexElement, ElementsElement> var7 = new FixedList <GeneratorLexElement, ElementsElement>(var5, var6);
                var4 = var7;
                var2.Add(var4);
            }
            FixedList <GeneratorLexElement, ElementsElement>[] var8;
            var8 = var2.ToArray();
            return(this.ReturnSelection(var1, var8));
        }
 /// <summary>
 /// selection = elements, {'|', elements} ;
 /// </summary>
 /// <param name="elements">elements</param>
 /// <param name="repetition">{'|', elements}</param>
 protected abstract SelectionElement ReturnSelection(ElementsElement elements, FixedList <GeneratorLexElement, ElementsElement>[] repetition);
        public void WriteParseCode(TextWriter writer, ScriptParserGenerator generator)
        {
            writer.Write(ScriptParserGenerator.GetAccessibilityString(generator.Settings.ParseMethodAccessibility));
            writer.Write(" ");
            writer.Write(generator.GetReturnClassIdentifier(this.DefinitionName));
            writer.Write(" ");
            writer.Write(generator.GetParseMethodIdentifier(this.DefinitionName));
            writer.WriteLine("() {");
            generator.IndentCount = 1;
            generator.InitializeVariableIndex(1);
            IDictionary <ElementsElement, MethodSignature> methods = this.GetReturnParameterSignaturesAndElements(generator);

            if (false)
            {
                // 普通のコード
                if (this.Expression.Selection.Candidates.Count >= 2)
                {
                    IList <string> firsts = this.Expression.Selection.GetFirstTerminals(generator);
                    string         peekVar;
                    writer.WriteLine(generator.GetCodeOfPeekOrThrow(this.DefinitionName, firsts, out peekVar));
                    Dictionary <string, string> usedFirsts = new Dictionary <string, string>();
                    foreach (ElementsElement elems in this.Expression.Selection.Candidates)
                    {
                        IList <string> innerFirsts = elems.GetFirstTerminals(generator);
                        foreach (string first in innerFirsts)
                        {
                            string usingPoint;
                            if (usedFirsts.TryGetValue(first, out usingPoint))
                            {
                                string context = string.Format("'{0}' の定義", this.DefinitionName);
                                string message = string.Format("<{1}> 内の <{0}> は <{2}> によって隠されます", first, elems.ToString(), usingPoint);
                                generator.Warn(context, message);
                            }
                            else
                            {
                                usedFirsts[first] = elems.ToString();
                            }
                        }
                        writer.WriteLine(generator.GetCodeOfIfLexisIn(peekVar, innerFirsts));

                        List <string> arguments = new List <string>();
                        foreach (ElementElement elem in elems.Elements)
                        {
                            string var = elem.WriteParseCode(writer, generator);
                            arguments.Add(var);
                        }
                        writer.WriteLine(generator.GetCodeOfReturnMethod(methods[elems].MethodName, arguments));
                        writer.Write(generator.GetCodeOfCloseBlock());
                        writer.Write(generator.GetCodeOfSingleElse());
                    }
                    writer.WriteLine(generator.GetCodeOfOpenBlock());

                    writer.WriteLine(generator.GetCodeOfThrowNew("System.NotImplementedException", ScriptParserGenerator.EscapeString(this.DefinitionName)));
                    writer.WriteLine(generator.GetCodeOfCloseBlock());
                }
                else
                {
                    ElementsElement elems       = this.Expression.Selection.Candidates.First();
                    IList <string>  innerFirsts = elems.GetFirstTerminals(generator);

                    List <string> arguments = new List <string>();
                    foreach (ElementElement elem in elems.Elements)
                    {
                        string var = elem.WriteParseCode(writer, generator);
                        arguments.Add(var);
                    }
                    writer.WriteLine(generator.GetCodeOfReturnMethod(methods[elems].MethodName, arguments));
                }
            }
            else
            {
                // 前半部分が同じSelectionをツリー状に探索するようにするために
                // SelectionSubCandidateを作る
                List <SelectionSubCandidate> subCandidates = new List <SelectionSubCandidate>();
                foreach (ElementsElement candidate in this.Expression.Selection.Candidates)
                {
                    subCandidates.Add(new SelectionSubCandidate(candidate));
                }

                SelectionSubCandidate.writeParseCodeAux(writer, generator, subCandidates, (candidateAtEmpty, writer2, generator2) => {
                    writer.WriteLine(generator.GetCodeOfReturnMethod(methods[candidateAtEmpty.OriginalElements].MethodName, candidateAtEmpty.TemporaryVariables));
                });
            }
            writer.Write("}");
        }
 private SelectionSubCandidate(ElementsElement original, IEnumerable <string> temporaryVariables, IEnumerable <ElementElement> restElements)
 {
     _originalElements   = original;
     _temporaryVariables = temporaryVariables.ToArray();
     _restElements       = new List <ElementElement>(restElements);
 }
 public SelectionSubCandidate(ElementsElement elements)
 {
     _originalElements   = elements;
     _temporaryVariables = new string[0];
     _restElements       = elements.Elements.ToList();
 }
        public bool Equals(DefinitionContent x, DefinitionContent y)
        {
            GroupElement x1 = x as GroupElement;

            if (x1 != null)
            {
                return(this.Equals(x1.InnerExpression, y));
            }
            GroupElement y1 = y as GroupElement;

            if (y1 != null)
            {
                return(this.Equals(x, y1.InnerExpression));
            }
            ExpressionsElement x2 = x as ExpressionsElement;

            if (x2 != null)
            {
                return(this.Equals(x2.Selection, y));
            }
            ExpressionsElement y2 = y as ExpressionsElement;

            if (y2 != null)
            {
                return(this.Equals(x, y2.Selection));
            }
            SelectionElement x3 = x as SelectionElement;
            SelectionElement y3 = y as SelectionElement;

            if (x3 != null && y3 != null)
            {
                // ∀x0(∈ x) x0 ∈ y かつ ∀y0(∈ y) y0 ∈ x ならば x = y
                return(x3.Candidates.All(x0 => y3.Candidates.Any(y0 => this.Equals(x0, y0))) && y3.Candidates.All(y0 => x3.Candidates.Any(x0 => this.Equals(x0, y0))));
            }
            ElementsElement x4 = x as ElementsElement;
            ElementsElement y4 = y as ElementsElement;

            if (x4 != null && y4 != null)
            {
                if (x4.Elements.Count != y4.Elements.Count)
                {
                    return(false);
                }
                return(CollectionEx.Zip(x4.Elements, y4.Elements, (x0, y0) => this.Equals(x0, y0)).All(eq => eq));
            }
            RepeatElement x5 = x as RepeatElement;
            RepeatElement y5 = y as RepeatElement;

            if (x5 != null && y5 != null)
            {
                return(this.Equals(x5.InnerExpression, y5.InnerExpression));
            }
            OptionElement x6 = x as OptionElement;
            OptionElement y6 = y as OptionElement;

            if (x6 != null && y6 != null)
            {
                return(this.Equals(x6.InnerExpression, y6.InnerExpression));
            }
            LiteralElement x7 = x as LiteralElement;
            LiteralElement y7 = y as LiteralElement;

            if (x7 != null && y7 != null)
            {
                return(x7.Literal.Type == y7.Literal.Type && x7.InnerWord == y7.InnerWord);
            }
            if (x == null && y == null)
            {
                return(true);
            }
            if (x == null || y == null)
            {
                return(false);
            }
            return(false);
        }