Beispiel #1
0
        public void RollbackCursor(TokenExtractorCursor cursor)
        {
            if (cursor.Position < 0 || cursor.Position > _reader.Length - 1)
            {
                throw new IndexOutOfRangeException();
            }

            _reader.Position = cursor.Position;
        }
Beispiel #2
0
        public SyntaxTree Parse(TokenExtractor extractor)
        {
            if (extractor == null)
            {
                throw new ArgumentNullException(nameof(extractor));
            }

            TokenExtractorCursor cursor = TokenExtractorCursor.Invalid;
            SyntaxTree           tree   = new SyntaxTree();

            // TODO: Mudar para [SyntaxTreeNode]
            Token token = null;

            try
            {
                cursor = extractor.SaveCursor();

                // TODO: Deve retornar [SyntaxTreeNode]
                token = _grammar.RootElement.Eval(extractor);

                if (token != null && extractor.EndOfCode)
                {
                    var node = new SyntaxTreeNode(token);

                    tree.Validate(node);
                }
            }
            catch (Exception ex)
            {
                if (!TokenExtractorCursor.Invalid.Equals(cursor))
                {
                    try { extractor.RollbackCursor(cursor); }
                    catch (Exception) { /* QUIET */ }
                }

                LogException(ex);
            }

            if (token == null || !tree.IsValid)
            {
                if (!TokenExtractorCursor.Invalid.Equals(cursor))
                {
                    try { extractor.RollbackCursor(cursor); }
                    catch (Exception) { /* QUIET */ }
                }
            }

            return(tree);
        }