public override object Visit(SymbolReference that, object value)
 {
     var result = (System.Text.StringBuilder) value;
     result.Append(that.Symbol);
     return null;
 }
Beispiel #2
0
 public override object Visit(SymbolReference that, object value)
 {
     _writer.Write(that.Symbol);
     return null;
 }
        public override object Visit(SymbolReference that, object value = null)
        {
            PrintPrologue(that);
            PrintReference(that);
            PrintEpilogue(that);

            return null;
        }
        public override object Visit(SymbolReference that, object value = null)
        {
            Object<Symbol> result;

            result = _symbols.Inner.FindUpwards(that.Symbol);
            if (result == null)
                throw new Toolbox.Error(Toolbox.ErrorKind.Fatal, that.Cursor, 0, "Unknown symbol: " + that.Symbol);

            that.Definition = result.Data.Definition;

            return (object) result.Data;
        }
Beispiel #5
0
        /** Parses a single reference to an absolute, an instance, or a relative symbol that already exists. */
        private Reference ParseReference()
        {
            PathKind kind;
            switch (_matcher.This.Kind)
            {
                case TokenKind.Name:
                    kind = PathKind.Relative;
                    break;

                case TokenKind.Dot:
                    _matcher.Match(TokenKind.Dot);
                    kind = PathKind.Instance;
                    break;

                case TokenKind.Exclamation:
                    _matcher.Match(TokenKind.Exclamation);
                    kind = PathKind.Absolute;
                    break;

                default:
                    throw new ParserError(_matcher.This.Cursor, "Expected absolute, instance-relative, or relative symbol reference");
            }

            Token first = _matcher.Match(TokenKind.Name);
            Reference result = new SymbolReference(first.Cursor, kind, first.Text);

            while (_matcher.This.Kind == TokenKind.Dot)
            {
                _matcher.Match(TokenKind.Dot);
                Token name = _matcher.Match(TokenKind.Name);
                result = new MemberReference(
                    first.Cursor,
                    result,
                    new SymbolReference(name.Cursor, PathKind.Member, name.Text)
                );
                first = name;
            }

            return result;
        }
Beispiel #6
0
        /** Parses a \c guard definition, which makes a \c value accessible through the a getter and/or a setter.
         *
         *  guard Foo is io .foo:
         *       get:
         *           return .foo
         *       set:
         *           .foo := 2 * value
         */
        private GuardStatement ParseGuardStatement()
        {
            Token start = _matcher.Match(TokenKind.Keyword_Guard);
            _matcher.Match(TokenKind.Space);
            SymbolDefinition name = ParseSymbolDefinition(SymbolKind.Guard);
            #if false
            Token @base = null;
            if (_matcher.This.Kind == TokenKind.Dot)
            {
                _matcher.Match(TokenKind.Dot);
                @base = name;
                @name = _matcher.Match(TokenKind.Name);
            }
            #endif
            _matcher.Match(TokenKind.Space);
            _matcher.Match(TokenKind.Keyword_Is);
            _matcher.Match(TokenKind.Space);
            DirectionKind direction = ParseDirection();
            _matcher.Match(TokenKind.Space);
            #if DONE
            Expression member = ParseInstanceExpression();
            #else
            _matcher.Match(TokenKind.Dot);
            Token token = _matcher.Match(TokenKind.Name);
            SymbolReference reference = new SymbolReference(token.Cursor, PathKind.Instance, token.Text);
            Type type = new NamedType(token.Cursor, reference);
            #endif

            Statement getter = null;
            Statement setter = null;
            if (_matcher.This.Kind == TokenKind.Colon)
            {
                _matcher.Match(TokenKind.Colon);
                _matcher.Match(TokenKind.EndOfLine);
                token = _matcher.Match(TokenKind.Indent);     // NOTE: Update 'token'!
                switch (direction)
                {
                    case DirectionKind.Out:
                        getter = ParseGetRoutine((Type) type.Clone());
                        break;

                    case DirectionKind.In:
                        setter = ParseSetRoutine((Type) type.Clone());
                        break;

                    case DirectionKind.InOut:
                        if (_matcher.This.Kind == TokenKind.Keyword_Get)
                            getter = ParseGetRoutine((Type) type.Clone());
                        if (_matcher.This.Kind == TokenKind.Keyword_Set)
                            setter = ParseSetRoutine((Type) type.Clone());
                        if (getter == null && setter == null)
                            throw new ParserError(token.Cursor, "Getter or setter must be specified after colon");
                        break;

                    default:
                        throw new System.ArgumentException("direction");
                }
                _matcher.Match(TokenKind.Dedent);
            }

            if (getter == null)
            {
                if (direction != DirectionKind.In)
                    getter = CreateDefaultGetter(token.Cursor, token.Text);
                else
                    getter = new NoneStatement(token.Cursor);
            }

            if (setter == null)
            {
                if (direction != DirectionKind.Out)
                    setter = CreateDefaultSetter(token.Cursor, token.Text);
                else
                    setter = new NoneStatement(token.Cursor);
            }

            return new GuardStatement(start.Cursor, name, direction, type, getter, setter);
        }