コード例 #1
0
        private bool IsNext(ProductionPattern pattern)
        {
            var set  = pattern.LookAhead;
            var flag = set == null;

            return(!flag && set.IsNext(this));
        }
コード例 #2
0
        private Node ParsePattern(ProductionPattern pattern)
        {
            var  defaultAlt = pattern.DefaultAlternative;
            var  num        = pattern.Count - 1;
            Node parsePattern;

            for (var i = 0; i <= num; i++)
            {
                var alt = pattern[i];
                // ReSharper disable once PossibleUnintendedReferenceComparison
                var flag = defaultAlt != alt && this.IsNext(alt);
                if (flag)
                {
                    parsePattern = this.ParseAlternative(alt);
                    return(parsePattern);
                }
            }
            var flag2 = defaultAlt == null || !this.IsNext(defaultAlt);

            if (flag2)
            {
                this.ThrowParseException(this.FindUnion(pattern));
            }
            parsePattern = this.ParseAlternative(defaultAlt);
            return(parsePattern);
        }
コード例 #3
0
ファイル: Parser.cs プロジェクト: jblacker/Flee
        private void CheckPattern(ProductionPattern pattern)
        {
            var num = pattern.Count - 1;

            for (var i = 0; i <= num; i++)
            {
                this.CheckAlternative(pattern.Name, pattern[i]);
            }
        }
コード例 #4
0
ファイル: Parser.cs プロジェクト: jblacker/Flee
        private string ToString(ProductionPattern prod)
        {
            var buffer = new StringBuilder();
            var indent = new StringBuilder();

            buffer.Append(prod.Name);
            buffer.Append(" (");
            buffer.Append(prod.Id);
            buffer.Append(") ");
            var num = buffer.Length - 1;

            for (var i = 0; i <= num; i++)
            {
                indent.Append(" ");
            }
            buffer.Append("= ");
            indent.Append("| ");
            var num2 = prod.Count - 1;

            for (var i = 0; i <= num2; i++)
            {
                var flag = i > 0;
                if (flag)
                {
                    buffer.Append(indent);
                }
                buffer.Append(this.ToString(prod[i]));
                buffer.Append("\n");
            }
            var num3 = prod.Count - 1;

            for (var i = 0; i <= num3; i++)
            {
                var set   = prod[i].LookAheadSet;
                var flag2 = set.GetMaxLength() > 1;
                if (flag2)
                {
                    buffer.Append("Using ");
                    buffer.Append(set.GetMaxLength());
                    buffer.Append(" token look-ahead for alternative ");
                    buffer.Append(i + 1);
                    buffer.Append(": ");
                    buffer.Append(set.ToString(this.Tokenizer));
                    buffer.Append("\n");
                }
            }
            return(buffer.ToString());
        }
コード例 #5
0
        public override void AddPattern(ProductionPattern pattern)
        {
            var flag = pattern.IsMatchingEmpty();

            if (flag)
            {
                throw new ParserCreationException(ParserCreationException.ErrorType.INVALID_PRODUCTION, pattern.Name,
                                                  "zero elements can be matched (minimum is one)");
            }
            var flag2 = pattern.IsLeftRecursive();

            if (flag2)
            {
                throw new ParserCreationException(ParserCreationException.ErrorType.INVALID_PRODUCTION, pattern.Name,
                                                  "left recursive patterns are not allowed");
            }
            base.AddPattern(pattern);
        }
コード例 #6
0
        private LookAheadSet FindLookAhead(ProductionPattern pattern, int length, CallStack stack, LookAheadSet filter)
        {
            var flag = stack.Contains(pattern.Name, length);

            if (flag)
            {
                throw new ParserCreationException(ParserCreationException.ErrorType.INFINITE_LOOP, pattern.Name, null);
            }
            stack.Push(pattern.Name, length);
            var result = new LookAheadSet(length);
            var num    = pattern.Count - 1;

            for (var i = 0; i <= num; i++)
            {
                var temp = this.FindLookAhead(pattern[i], length, 0, stack, filter);
                result.AddAll(temp);
            }
            stack.Pop();
            return(result);
        }
コード例 #7
0
ファイル: Parser.cs プロジェクト: jblacker/Flee
        public virtual void AddPattern(ProductionPattern pattern)
        {
            var flag = pattern.Count <= 0;

            if (flag)
            {
                throw new ParserCreationException(ParserCreationException.ErrorType.INVALID_PRODUCTION, pattern.Name,
                                                  "no production alternatives are present (must have at least one)");
            }
            var flag2 = this.patternIds.ContainsKey(pattern.Id);

            if (flag2)
            {
                throw new ParserCreationException(ParserCreationException.ErrorType.INVALID_PRODUCTION, pattern.Name,
                                                  Conversions.ToString(Conversions.ToDouble("another pattern with the same id (")
                                                                       + pattern.Id + Conversions.ToDouble(") has already been added")));
            }
            this.patterns.Add(pattern);
            this.patternIds.Add(pattern.Id, pattern);
            this.SetInitialized(false);
        }
コード例 #8
0
        private LookAheadSet FindConflicts(ProductionPattern pattern, int maxLength)
        {
            var result = new LookAheadSet(maxLength);
            var num    = pattern.Count - 1;

            for (var i = 0; i <= num; i++)
            {
                var set  = pattern[i].LookAheadSet;
                var num2 = i - 1;
                for (var j = 0; j <= num2; j++)
                {
                    var set2 = pattern[j].LookAheadSet;
                    result.AddAll(set.CreateIntersection(set2));
                }
            }
            var flag = result.IsRepetitive();

            if (flag)
            {
                this.ThrowAmbiguityException(pattern.Name, null, result);
            }
            return(result);
        }
コード例 #9
0
        private LookAheadSet FindUnion(ProductionPattern pattern)
        {
            var          length = 0;
            var          num    = pattern.Count - 1;
            LookAheadSet result;

            for (var i = 0; i <= num; i++)
            {
                result = pattern[i].LookAheadSet;
                var flag = result.GetMaxLength() > length;
                if (flag)
                {
                    length = result.GetMaxLength();
                }
            }
            result = new LookAheadSet(length);
            var num2 = pattern.Count - 1;

            for (var i = 0; i <= num2; i++)
            {
                result.AddAll(pattern[i].LookAheadSet);
            }
            return(result);
        }
コード例 #10
0
        private void CalculateLookAhead(ProductionPattern pattern)
        {
            var previous = new LookAheadSet(0);
            var length   = 1;
            var stack    = new CallStack();

            stack.Push(pattern.Name, 1);
            var result       = new LookAheadSet(1);
            var alternatives = new LookAheadSet[pattern.Count - 1 + 1];
            var num          = pattern.Count - 1;

            for (var i = 0; i <= num; i++)
            {
                var alt = pattern[i];
                alternatives[i]  = this.FindLookAhead(alt, 1, 0, stack, null);
                alt.LookAheadSet = alternatives[i];
                result.AddAll(alternatives[i]);
            }
            var flag = pattern.LookAhead == null;

            if (flag)
            {
                pattern.LookAhead = result;
            }
            var conflicts = this.FindConflicts(pattern, 1);

            while (conflicts.Size() > 0)
            {
                length++;
                stack.Clear();
                stack.Push(pattern.Name, length);
                conflicts.AddAll(previous);
                var num2 = pattern.Count - 1;
                for (var i = 0; i <= num2; i++)
                {
                    var alt   = pattern[i];
                    var flag2 = alternatives[i].Intersects(conflicts);
                    if (flag2)
                    {
                        alternatives[i]  = this.FindLookAhead(alt, length, 0, stack, conflicts);
                        alt.LookAheadSet = alternatives[i];
                    }
                    var flag3 = alternatives[i].Intersects(conflicts);
                    if (flag3)
                    {
                        var flag4 = pattern.DefaultAlternative == null;
                        if (flag4)
                        {
                            pattern.DefaultAlternative = alt;
                        }
                        else
                        {
                            // ReSharper disable once PossibleUnintendedReferenceComparison
                            var flag5 = pattern.DefaultAlternative != alt;
                            if (flag5)
                            {
                                result = alternatives[i].CreateIntersection(conflicts);
                                this.ThrowAmbiguityException(pattern.Name, null, result);
                            }
                        }
                    }
                }
                previous  = conflicts;
                conflicts = this.FindConflicts(pattern, length);
            }
            var num3 = pattern.Count - 1;

            for (var i = 0; i <= num3; i++)
            {
                this.CalculateLookAhead(pattern[i], 0);
            }
        }
コード例 #11
0
ファイル: Production.cs プロジェクト: jblacker/Flee
 public Production(ProductionPattern pattern)
 {
     this.Pattern  = pattern;
     this.children = new ArrayList();
 }
コード例 #12
0
 internal void SetPattern(ProductionPattern pattern)
 {
     this.Pattern = pattern;
 }