Example #1
0
        /**
         * Parses the rest of a v-name, and constructs an AST to represent its phrase
         * structure.
         *
         * @param firstIdentifier
         *          the {@link triangle.compiler.syntax.trees.terminals.Identifier}
         *          that is the start of the
         *          {@link triangle.compiler.syntax.trees.vnames.Vname}
         *
         * @return a {@link triangle.compiler.syntax.trees.vnames.Vname}
         *
         * @throws SyntaxError
         *           a syntactic error
         *
         */
        Vname ParseRestOfVname(Identifier firstIdentifier)
        {
            var   startLocation = firstIdentifier.Start;
            Vname vname         = new SimpleVname(firstIdentifier, firstIdentifier.Position);

            while (_currentToken.Kind == TokenKind.Dot ||
                   _currentToken.Kind == TokenKind.LeftBracket)
            {
                if (_currentToken.Kind == TokenKind.Dot)
                {
                    AcceptIt();
                    var identifier    = ParseIdentifier();
                    var vnamePosition = new SourcePosition(startLocation, _currentToken.Finish);
                    vname = new DotVname(vname, identifier, vnamePosition);
                }
                else
                {
                    AcceptIt();
                    var expression = ParseExpression();
                    Accept(TokenKind.RightBracket);
                    var vnamePosition = new SourcePosition(startLocation, _currentToken.Finish);
                    vname = new SubscriptVname(vname, expression, vnamePosition);
                }
            }

            return(vname);
        }
Example #2
0
        public TypeDenoter VisitDotVname(DotVname ast, Void arg)
        {
            ast.Type = null;
            var vnameType = ast.Vname.Visit(this);
            var record    = vnameType as RecordTypeDenoter;

            if (record != null)
            {
                ast.Type = CheckFieldIdentifier(record.FieldType, ast.Identifier);
                CheckAndReportError(ast.Type != StandardEnvironment.ErrorType,
                                    "no field \"%\" in this record type", ast.Identifier);
            }
            else
            {
                ReportError("record expected here", ast.Vname);
            }
            return(ast.Type);
        }
Example #3
0
        // Value-or-variable names

        public IFetchableEntity VisitDotVname(DotVname ast, Frame frame)
        {
            return(ast.Vname.Visit(this, frame));
        }