protected override bool EndLeaf()
        {
            if (mIsSuccessfulFinished == false)
            {
                var tmpSb = new StringBuilder();

                tmpSb.Append("Abnormal termination instruction");

                var tmpExcept = new SyntaxerException(tmpSb.ToString());

                if(mLastToken != null)
                {
                    tmpExcept.Line = mLastToken.Line;
                    tmpExcept.Pos = mLastToken.Pos;
                }

                throw tmpExcept;
            }

            return true;
        }
Example #2
0
        public Parser.ScriptCodeDom.Operators.Operator CreateScriptCodeDomNode()
        {
            Parser.ScriptCodeDom.Operators.Operator tmpObj = null;

            switch (TokenType)
            {
                case Lexer.TokenKind.String:
                    tmpObj = new ScriptCodeDom.Operators.StringLiteralReference(Value);
                    break;

                case Lexer.TokenKind.METHOD:
                    var tmpCallMethodOperator = new ScriptCodeDom.Operators.CallMethodOperator(Value);

                    tmpObj = tmpCallMethodOperator;

                    if (!StillOneScriptCore.Common.TypeHelpers.ListHelper.IsEmpty(Right.AdditionalItems))
                    {
                        foreach (var param in Right.AdditionalItems)
                        {
                            var tmpParam = new ScriptCodeDom.Operators.FunctionParameter();

                            tmpParam.Operator = param.CreateScriptCodeDomNode();

                            tmpCallMethodOperator.AddParameter(tmpParam);
                        }
                    }
                    break;

                case Lexer.TokenKind.VARIABLE:
                    tmpObj = new ScriptCodeDom.Operators.VariableReference(Value);
                    break;

                default:
                    var tmpSb = new StringBuilder();

                    tmpSb.Append("Unexpected construction");

                    var tmpExcept = new SyntaxerException(tmpSb.ToString());

                    tmpExcept.Line = this.Line;
                    tmpExcept.Pos = this.Pos;
                    tmpExcept.TokenText = Value;

                    throw tmpExcept;
            }

            var tmpUnaryOperator = tmpObj as ScriptCodeDom.Operators.UnaryOperator;

            if (tmpUnaryOperator != null)
            {
                tmpUnaryOperator.Left = this.Left.CreateScriptCodeDomNode();
            }

            return tmpObj;
        }
        protected override ResultOfProcess ProcessToken(Lexer.Token token)
        {
            if (mParent.IsTerminateCondition(token))
            {
                this.Context.Recovery(token);

                return ResultOfProcess.Stop;
            }

            if(token.TokenType == Lexer.TokenKind.Name)
            {
                if (mCurrNode == null || mCurrNode.TokenType != Lexer.TokenKind.OPERATOR_GET_MEMBER)
                {
                    token.TokenType = Lexer.TokenKind.VARIABLE;
                }
                else
                {
                    token.TokenType = Lexer.TokenKind.MEMBER;
                }
            }

            if (token.TokenType == Lexer.TokenKind.Point)
            {
                token.TokenType = Lexer.TokenKind.OPERATOR_GET_MEMBER;
            }

            if (token.TokenType == Lexer.TokenKind.OPEN_ROUND_BRACKET)
            {
                if (mCurrNode.TokenType == Lexer.TokenKind.MEMBER)
                {
                    var tmpParentNode = mCurrNode.Parent;

                    tmpParentNode.TokenType = Lexer.TokenKind.METHOD;
                    tmpParentNode.Value = mCurrNode.Value;
                    tmpParentNode.Line = mCurrNode.Line;
                    tmpParentNode.Pos = mCurrNode.Pos;

                    mCurrNode.Value = "(...)";
                    mCurrNode.TokenType = Lexer.TokenKind.FUNCTION_ARGUMENTS;

                    var tmpParamsLeaf = new Syntaxer.OperatorLeafs.ParamsLeaf(this.Context);

                    var tmpRez = tmpParamsLeaf.Run();

                    mCurrNode.AdditionalItems = tmpParamsLeaf.RootNode.AdditionalItems;

                    return tmpRez;
                }
            }

            ChangeNodes(token);

            if (token.TokenType == Lexer.TokenKind.VARIABLE)
            {
                mCurrNode.Value = token.Text;
                mCurrNode.TokenType = token.TokenType;
                mCurrNode.Priority = TokenPriority(token.TokenType);
                mCurrNode.Line = token.Line;
                mCurrNode.Pos = token.Pos;

                return ResultOfProcess.Continue;
            }

            if (token.TokenType == Lexer.TokenKind.String)
            {
                mCurrNode.Value = token.Text;
                mCurrNode.TokenType = token.TokenType;
                mCurrNode.Priority = TokenPriority(token.TokenType);
                mCurrNode.Line = token.Line;
                mCurrNode.Pos = token.Pos;

                return ResultOfProcess.Continue;
            }

            if (token.TokenType == Lexer.TokenKind.OPERATOR_GET_MEMBER)
            {
                mCurrNode.Value = token.Text;
                mCurrNode.TokenType = token.TokenType;
                mCurrNode.Priority = TokenPriority(token.TokenType);
                mCurrNode.Line = token.Line;
                mCurrNode.Pos = token.Pos;

                return ResultOfProcess.Continue;
            }

            if (token.TokenType == Lexer.TokenKind.MEMBER)
            {
                mCurrNode.Value = token.Text;
                mCurrNode.TokenType = token.TokenType;
                mCurrNode.Priority = TokenPriority(token.TokenType);
                mCurrNode.Line = token.Line;
                mCurrNode.Pos = token.Pos;

                return ResultOfProcess.Continue;
            }

            var tmpSb = new StringBuilder();

            tmpSb.Append("Unexpected token \"");
            tmpSb.Append(token.Text);
            tmpSb.Append("\"");

            var tmpExcept =  new SyntaxerException(tmpSb.ToString());

            tmpExcept.Line = token.Line;
            tmpExcept.Pos = token.Pos;
            tmpExcept.TokenText = token.Text;

            throw tmpExcept;
        }