コード例 #1
0
ファイル: LookAheadSet.cs プロジェクト: ThomasZitzler/FleeExt
        public LookAheadSet CreateFilter(LookAheadSet set)
        {
            LookAheadSet result = new LookAheadSet(_maxLength);

            // Handle special cases
            if (this.Size() <= 0 || set.Size() <= 0)
            {
                return(this);
            }

            // Create combinations
            for (int i = 0; i < _elements.Count; i++)
            {
                var first = (Sequence)_elements[i];
                for (int j = 0; j < set._elements.Count; j++)
                {
                    var second = (Sequence)set._elements[j];
                    if (first.StartsWith(second))
                    {
                        result.Add(first.Subsequence(second.Length()));
                    }
                }
            }
            return(result);
        }
コード例 #2
0
        private LookAheadSet FindLookAhead(ProductionPatternElement elem,
                                           int length,
                                           int dummy,
                                           CallStack stack,
                                           LookAheadSet filter)
        {
            LookAheadSet result;

            if (elem.IsToken())
            {
                result = new LookAheadSet(length);
                result.Add(elem.Id);
            }
            else
            {
                var pattern = GetPattern(elem.Id);
                result = FindLookAhead(pattern, length, stack, filter);
                if (stack.Contains(pattern.Name))
                {
                    result = result.CreateRepetitive();
                }
            }

            return(result);
        }
コード例 #3
0
ファイル: LookAheadSet.cs プロジェクト: ThomasZitzler/FleeExt
        public LookAheadSet CreateRepetitive()
        {
            LookAheadSet result = new LookAheadSet(_maxLength);

            for (int i = 0; i < _elements.Count; i++)
            {
                var seq = (Sequence)_elements[i];
                if (seq.IsRepetitive())
                {
                    result.Add(seq);
                }
                else
                {
                    result.Add(new Sequence(true, seq));
                }
            }
            return(result);
        }
コード例 #4
0
ファイル: LookAheadSet.cs プロジェクト: ThomasZitzler/FleeExt
        public LookAheadSet CreateIntersection(LookAheadSet set)
        {
            LookAheadSet result = new LookAheadSet(_maxLength);

            for (int i = 0; i < _elements.Count; i++)
            {
                var seq1 = (Sequence)_elements[i];
                var seq2 = set.FindSequence(seq1);
                if (seq2 != null && seq1.IsRepetitive())
                {
                    result.Add(seq2);
                }
                else if (seq2 != null)
                {
                    result.Add(seq1);
                }
            }
            return(result);
        }
コード例 #5
0
ファイル: LookAheadSet.cs プロジェクト: ThomasZitzler/FleeExt
        public LookAheadSet CreateOverlaps(LookAheadSet set)
        {
            LookAheadSet result = new LookAheadSet(_maxLength);

            for (int i = 0; i < _elements.Count; i++)
            {
                var seq = (Sequence)_elements[i];
                if (set.IsOverlap(seq))
                {
                    result.Add(seq);
                }
            }
            return(result);
        }
コード例 #6
0
ファイル: LookAheadSet.cs プロジェクト: ThomasZitzler/FleeExt
        public LookAheadSet CreateCombination(LookAheadSet set)
        {
            LookAheadSet result = new LookAheadSet(_maxLength);

            // Handle special cases
            if (this.Size() <= 0)
            {
                return(set);
            }
            else if (set.Size() <= 0)
            {
                return(this);
            }

            // Create combinations
            for (int i = 0; i < _elements.Count; i++)
            {
                var first = (Sequence)_elements[i];
                if (first.Length() >= _maxLength)
                {
                    result.Add(first);
                }
                else if (first.Length() <= 0)
                {
                    result.AddAll(set);
                }
                else
                {
                    for (int j = 0; j < set._elements.Count; j++)
                    {
                        var second = (Sequence)set._elements[j];
                        result.Add(first.Concat(_maxLength, second));
                    }
                }
            }
            return(result);
        }
コード例 #7
0
ファイル: LookAheadSet.cs プロジェクト: ThomasZitzler/FleeExt
        public LookAheadSet CreateNextSet(int token)
        {
            LookAheadSet result = new LookAheadSet(_maxLength - 1);

            for (int i = 0; i < _elements.Count; i++)
            {
                var seq   = (Sequence)_elements[i];
                var value = seq.GetToken(0);
                if (value != null && token == (int)value)
                {
                    result.Add(seq.Subsequence(1));
                }
            }
            return(result);
        }