Esempio n. 1
0
 public CallCommand(Identifier identifier, ParameterSequence parameters, SourcePosition position)
     : base(position)
 {
     Compiler.WriteDebuggingInfo($"Creating {this.GetType().Name}");
     Identifier = identifier;
     Parameters = parameters;
 }
        ///////////////////////////////////////////////////////////////////////////////
        //
        // PARAMETERS
        //
        ///////////////////////////////////////////////////////////////////////////////

        ParameterSequence ParseParameters()
        {
            Compiler.WriteDebuggingInfo("Parsing Parameters");
            Location startLocation = tokens.Current.Position.Start;

            if (tokens.Current.Kind == TokenKind.RightBracket)
            {
                SourcePosition parameterPosition = new SourcePosition(startLocation, tokens.Current.Position.Finish);
                return(new EmptyParameterSequence(parameterPosition));
            }
            Parameter parameter = ParseParameter();

            if (tokens.Current.Kind == TokenKind.Comma)
            {
                AcceptIt();

                ParameterSequence paramseq = ParseParameters();
                //Parameter parameter2 = ParseParameters();
                SourcePosition parameterPosition = new SourcePosition(startLocation, tokens.Current.Position.Finish);
                return(new MultipleParameterSequence(parameter, paramseq, parameterPosition));
            }
            else
            {
                SourcePosition parameterPosition = new SourcePosition(startLocation, tokens.Current.Position.Finish);
                return(new SingleParameterSequence(parameter, parameterPosition));
            }
        }
        ///////////////////////////////////////////////////////////////////////////////
        // PARAMETERS
        ///////////////////////////////////////////////////////////////////////////////
        private ParameterSequence ParseParameters()
        {
            Compiler.WriteDebuggingInfo("Parsing Parameters");
            Location startLocation = tokens.Current.Start;

            /*
             * if(tokens.Current.Kind == TokenKind.RightBracket)
             *      return new EmptyParameterSequence(new SourcePosition(startLocation, tokens.Current.Finish));
             * ParameterSequence ps = new SingleParameterSequence(ParseParameter(), new SourcePosition(startLocation, tokens.Current.Finish));
             * while(tokens.Current.Kind == TokenKind.Comma) {
             *      AcceptIt();
             *      ps = new MultipleParameterSequence(ParseParameter(), ps, new SourcePosition(startLocation, tokens.Current.Finish));
             * }
             * return ps;
             */
            Parameter p = ParseParameter();

            if (tokens.Current.Kind == TokenKind.Comma)
            {
                AcceptIt();
                ParameterSequence ps = ParseParameters();
                SourcePosition    parameterPosition = new SourcePosition(startLocation, tokens.Current.Position.Finish);
                return(new MultipleParameterSequence(p, ps, parameterPosition));
            }
            else
            {
                SourcePosition parameterPosition = new SourcePosition(startLocation, tokens.Current.Position.Finish);
                return(new SingleParameterSequence(p, parameterPosition));
            }
        }
Esempio n. 4
0
 public MultipleParameterSequence(Parameter parameter, ParameterSequence parameters,
                                  SourcePosition position)
     : base(position)
 {
     Compiler.WriteDebuggingInfo($"Creating {this.GetType().Name}");
     Parameter  = parameter;
     Parameters = parameters;
 }
Esempio n. 5
0
        ///////////////////////////////////////////////////////////////////////////////
        //
        // PARAMETERS
        //
        ///////////////////////////////////////////////////////////////////////////////

        ParameterSequence ParseParameters()
        {
            Compiler.WriteDebuggingInfo("Parsing Parameters");
            Location  startLocation = tokens.Current.Position.Start;
            Parameter p             = ParseParameter();

            if (tokens.Current.Kind == TokenKind.Comma)
            {
                AcceptIt();
                ParameterSequence p2 = ParseParameters();
                SourcePosition    parameterPosition = new SourcePosition(startLocation, tokens.Current.Position.Finish);
                return(new MultipleParameterSequence(p, p2, parameterPosition));
            }
            else
            {
                SourcePosition parameterPosition = new SourcePosition(startLocation, tokens.Current.Position.Finish);
                return(new SingleParameterSequence(p, parameterPosition));
            }
        }
Esempio n. 6
0
        /// Parses the single command, and constructs an AST to represent its phrase structure.
        /// @returns	a {@link triangle.compiler.syntax.trees.commands.Command}
        /// @throw		syntaxError
        private Command ParseSingleCommand()
        {
            Compiler.WriteDebuggingInfo("Parsing Single Command");
            Location startLocation = tokens.Current.Start;

            switch (tokens.Current.Kind)
            {
            case TokenKind.Identifier: {
                Compiler.WriteDebuggingInfo("Parsing Assignment Command or Call Command");
                Identifier identifier = ParseIdentifier();
                if (tokens.Current.Kind == TokenKind.LeftBracket)
                {
                    Compiler.WriteDebuggingInfo("Parsing Call Command");
                    AcceptIt();
                    ParameterSequence parameters = ParseParameters();
                    Accept(TokenKind.RightBracket);
                    return(new CallCommand(identifier, parameters, new SourcePosition(startLocation, tokens.Current.Finish)));
                }
                else if (tokens.Current.Kind == TokenKind.Becomes)
                {
                    Compiler.WriteDebuggingInfo("Parsing Assignment Command");
                    Accept(TokenKind.Becomes);
                    Expression expression = ParseExpression();
                    return(new AssignCommand(identifier, expression, new SourcePosition(startLocation, tokens.Current.Finish)));
                }
                else
                {
                    RaiseSyntacticError("Expected either an assignment or function call but found a \"%\"", tokens.Current);
                    return(null);
                }
            }

            case TokenKind.Begin: {
                Compiler.WriteDebuggingInfo("Parsing Begin Command");
                AcceptIt();
                Command command = ParseCommand();
                Accept(TokenKind.End);
                return(command);
            }

            case TokenKind.Let: {
                Compiler.WriteDebuggingInfo("Parsing Let Command");
                AcceptIt();
                Declaration declaration = ParseDeclaration();
                Accept(TokenKind.In);
                Command        c = ParseSingleCommand();
                SourcePosition commandPosition = new SourcePosition(startLocation, tokens.Current.Finish);
                return(new LetCommand(declaration, c, commandPosition));
            }

            case TokenKind.If: {
                Compiler.WriteDebuggingInfo("Parsing If Command");
                AcceptIt();
                var e = ParseExpression();
                Accept(TokenKind.Then);
                var tc = ParseSingleCommand();
                Accept(TokenKind.Else);
                var            fc = ParseSingleCommand();
                SourcePosition commandPosition = new SourcePosition(startLocation, tokens.Current.Finish);
                return(new IfCommand(e, tc, fc, commandPosition));
            }

            case TokenKind.While: {
                Compiler.WriteDebuggingInfo("Parsing While Command");
                AcceptIt();
                var e = ParseExpression();
                Accept(TokenKind.Do);
                var            c = ParseSingleCommand();
                SourcePosition commandPosition = new SourcePosition(startLocation, tokens.Current.Finish);
                return(new WhileCommand(e, c, commandPosition));
            }

            case TokenKind.Skip: {
                Compiler.WriteDebuggingInfo("Parsing Skip Command");
                AcceptIt();
                SourcePosition commandPosition = new SourcePosition(startLocation, tokens.Current.Finish);
                return(new SkipCommand(commandPosition));
            }

            default:
                RaiseSyntacticError("\"%\" cannot start a command", tokens.Current);
                return(null);
            }
        }
        /// <summary>
        /// Parses the primary expression, and constructs an AST to represent its
        /// phrase structure.
        /// </summary>
        /// <returns>
        /// an <link>Triangle.SyntaxTrees.Expressions.Expression</link>
        /// </returns>
        /// <throws type="SyntaxError">
        /// a syntactic error
        /// </throws>
        Expression ParsePrimaryExpression()
        {
            Compiler.WriteDebuggingInfo("Parsing Primary Expression");
            Location startLocation = tokens.Current.Start;

            switch (tokens.Current.Kind)
            {
            case TokenKind.IntLiteral:
            {
                Compiler.WriteDebuggingInfo("Parsing Int Expression");
                IntegerLiteral integer       = ParseIntegerLiteral();
                SourcePosition expressionPos = new SourcePosition(startLocation, tokens.Current.Finish);
                return(new IntegerExpression(integer, expressionPos));
            }

            case TokenKind.CharLiteral:
            {
                Compiler.WriteDebuggingInfo("Parsing Char Expression");
                CharacterLiteral charlit       = ParseCharacterLiteral();
                SourcePosition   expressionPos = new SourcePosition(startLocation, tokens.Current.Finish);
                return(new CharacterExpression(charlit, expressionPos));
            }


            case TokenKind.Identifier:
            {
                Compiler.WriteDebuggingInfo("Parsing Call Expression or Identifier Expression");
                Identifier identifier = ParseIdentifier();
                if (tokens.Current.Kind == TokenKind.LeftBracket)
                {
                    Compiler.WriteDebuggingInfo("Parsing Call Expression");
                    AcceptIt();
                    ParameterSequence parameterSequence = ParseParameters();
                    Accept(TokenKind.RightBracket);
                    SourcePosition expressionPos = new SourcePosition(startLocation, tokens.Current.Finish);
                    return(new CallExpression(identifier, parameterSequence, expressionPos));
                }
                else
                {
                    Compiler.WriteDebuggingInfo("Parsing Identifier Expression");
                    SourcePosition expressionPos = new SourcePosition(startLocation, tokens.Current.Finish);
                    return(new IdExpression(identifier, expressionPos));
                }
            }

            case TokenKind.Operator:
            {
                Compiler.WriteDebuggingInfo("Parsing Unary Expression");
                Operator       operat        = ParseOperator();
                Expression     expression    = ParsePrimaryExpression();
                SourcePosition expressionPos = new SourcePosition(startLocation, tokens.Current.Finish);
                return(new UnaryExpression(operat, expression, expressionPos));
            }

            case TokenKind.LeftBracket:
            {
                Compiler.WriteDebuggingInfo("Parsing Bracket Expression");
                AcceptIt();
                Expression expression = ParseExpression();
                Accept(TokenKind.RightBracket);
                return(expression);
            }

            default:
            {
                RaiseSyntacticError("\"%\" cannot start an expression", tokens.Current);
                return(null);
            }
            }
        }