예제 #1
0
        public void ParseBlock( Block block, Tokens tokens )
        {
            bool enclosed = false;
            if ( tokens.PeekToken () == BeginBlock )
            {
                enclosed = true;
                tokens.RemoveNextToken ( BeginBlock );
            }

            while ( !tokens.AtEnd () )
            {
                if ( enclosed && tokens.PeekToken () == EndBlock )
                {
                    tokens.RemoveNextToken ( EndBlock );
                    break;
                }

                bool parsed = false;
                foreach ( IStatementParser parser in _parsers )
                {
                    IStatement nextStatement;
                    if ( parser.TryParse( tokens, block.Scope, out nextStatement ) )
                    {
                        block.Add ( nextStatement );
                        parsed = true;
                        break;
                    }
                }

                if (!parsed)
                    throw new Exception("Unable to parse token " + tokens.PeekToken() );
            }
        }
예제 #2
0
        public Expression ParseArray(IScope scope, Tokens tokens)
        {
            var result = new ArrayExpr( _executorFactory.GetArrayExecutor() );

            tokens.RemoveNextToken(BeginArray);

            while (tokens.PeekToken() != EndArray)
            {
                result.Elements.Add(this.ParseValue(scope, tokens));
                tokens.RemoveNextToken(ArraySeparator);
            }

            tokens.RemoveNextToken(EndArray);

            return result;
        }
예제 #3
0
        public bool TryParse(Tokens tokens, IScope scope, out IStatement statement)
        {
            if ( tokens.PeekToken () == PrintTag )
            {
                // Print statement
                tokens.RemoveNextToken ( PrintTag );
                Print print = new Print( _executorFactory.GetPrintExecutor ());
                print.Expr = _expressionParser.ParseExpression ( scope, tokens );

                statement = print;
                return true;
            }

            statement = null;
            return false;
        }
예제 #4
0
파일: IfParser.cs 프로젝트: mdcuesta/Ongle
        public bool TryParse(Tokens tokens, IScope scope, out IStatement statement)
        {
            if ( tokens.PeekToken () == IfTag )
            {
                tokens.RemoveNextToken ( IfTag );
                If iff = new If ( _executorFactory.GetIfExecutor ());
                iff.Test = _expressionParser.ParseExpression ( scope, tokens );
                iff.Body = _blockParser.GetBlock ( scope, tokens );

                statement = iff;
                return true;
            }

            statement = null;
            return false;
        }
예제 #5
0
        public bool TryParse(Tokens tokens, IScope scope, out IStatement statement)
        {
            // This is a block call
            Variable variable = new Variable ( _executorFactory.GetVariableExecutor() );
            variable.Scope = scope;
            variable.Ident = tokens.PullToken ();

            // Check if there is an indexer into the variable
            if (tokens.PeekToken () == "[")
            {
                tokens.PullToken ();
                variable.Indexer = _expressionParser.ParseExpression ( scope, tokens );
                tokens.RemoveNextToken ("]");
            }

            if ( tokens.NextTokenIs("(") )
            {
                // Parse the parameters..
                variable.Parameters = _expressionParser.ParseArray( scope, tokens ) as ArrayExpr;
            }

            statement = variable;
            return true;
        }
예제 #6
0
        /// <summary>
        /// Value is a constant string, number or variable name.
        /// </summary>
        /// <param name="tokens"></param>
        /// <returns></returns>
        public Expression ParseValue( IScope scope, Tokens tokens )
        {
            Expression value = null;

            if ( tokens.NextTokenIs ( BeginBlock ) )
            {
                value = _blockParser.GetBlock ( scope, tokens );
            }
            else if ( tokens.PeekToken().StartsWith ( "'" ) && tokens.PeekToken().EndsWith ( "'" ) )
            {
                string literal = tokens.PullToken().Trim ( '\'' );
                value = new StringLiteral
                {
                    Value = literal
                };
            }
            else if ( tokens.PeekToken().IsNumber () )
            {
                value = new NumberLiteral
                {
                    Value = double.Parse ( tokens.PullToken() )
                };
            }
            else if ( tokens.NextTokenIs(BeginArray) )
            {
                return this.ParseArray ( scope, tokens );
            }
            else
            {
                var variable = new Variable ( _executorFactory.GetVariableExecutor () );
                variable.Scope = scope;
                variable.Ident = tokens.PullToken();

                // Check if there is an indexer into the variable
                if (tokens.PeekToken () == "[")
                {
                    tokens.PullToken ();
                    variable.Indexer = ParseExpression ( scope, tokens );
                    tokens.RemoveNextToken ("]");
                }

                value = variable;
            }

            return value;
        }