Vname ParseRestOfVname(Identifier firstIdentifier)
        {
            var   startLocation = firstIdentifier.Start;
            Vname vname         = new SimpleVname(firstIdentifier, firstIdentifier.Position);

            return(vname);
        }
        /**
         * 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);
        }
Beispiel #3
0
        public TypeDenoter VisitSimpleVname(SimpleVname ast, Void arg)
        {
            var binding = ast.Identifier.Visit(this);

            if (binding is IConstantDeclaration constant)
            {
                return(ast.Type = constant.Type);
            }

            if (binding is IVariableDeclaration variable)
            {
                return(ast.Type = variable.Type);
            }

            ReportUndeclaredOrError(binding, ast.Identifier, "\"%\" is not a const or var identifier");
            return(ast.Type = StandardEnvironment.ErrorType);
        }
Beispiel #4
0
 public IFetchableEntity VisitSimpleVname(SimpleVname ast, Frame frame)
 {
     return(ast.Identifier.Declaration.Entity as IFetchableEntity);
 }