コード例 #1
0
        // Arguments = "(" [Expression { COMMA Expression }] ")"

        private List <Expression> Arguments()
        {
            int pos = S.Pos;
            List <Expression> args = new List <Expression>();

            if (S.Token == LPAREN)
            {
                S.NextToken();
                if (S.Token != RPAREN)
                {
                    args.Add(GetExpression());
                    while (S.Token == COMMA)
                    {
                        S.NextToken();
                        args.Add(GetExpression());
                    }
                }
                Accept(RPAREN);
            }
            else
            {
                throw ScriptCompileException.CreateSyntaxError(S.Line, S.Col, S.Token, S.TokenString);
            }
            return(args);
        }
コード例 #2
0
 private string Ident()
 {
     if (S.Token == IDENTIFIER)
     {
         string name = S.TokenString;
         S.NextToken();
         return(name);
     }
     else
     {
         throw ScriptCompileException.CreateIsNotIdentifier(S.TokenString);
     }
 }
コード例 #3
0
ファイル: Instructor.cs プロジェクト: ycllz/ScriptInterpreter
            public void AddSymbolVar(string localName)
            {
                Dictionary <string, Int32> symbolTable = _blockSymbolTable[_blockSymbolTable.Count - 1];

                int at;

                if (symbolTable.TryGetValue(localName, out at) == false)   //不存在
                {
                    symbolTable.Add(localName, IndexTop++);
                }
                else
                {
                    throw ScriptCompileException.CreateContentExist(localName);
                }
            }
コード例 #4
0
 public void Accept(int token)
 {
     if (token == SEMI)    //  ; 处理,可以不加;
     {
         if (S.Token == token)
         {
             S.NextToken();
         }
         return;
     }
     if (S.Token == token)
     {
         S.NextToken();
     }
     else
     {
         throw ScriptCompileException.CreateSyntaxError(S.Line, S.Col, S.Token, S.TokenString);
     }
 }
コード例 #5
0
        private bool FormalParameter()
        {
            if (S.Token == IDENTIFIER)            //标识符
            {
                Instructor.CompileIndexStack.AddSymbolVar(S.TokenString);

                S.NextToken();

                return(false);
            }
            else if (S.Token == UntPar)
            {
                Instructor.CompileIndexStack.AddSymbolVar("args");
                S.NextToken();
                return(true);
            }
            else
            {
                throw ScriptCompileException.CreateSyntaxError(S.Line, S.Col, S.Token, S.TokenString);
            }
        }
コード例 #6
0
        private Expression Term3()
        {
            Expression t = null;

            switch (S.Token)
            {
            case PLUSPLUS:               // 例如 ++i
                S.NextToken();
                t = Term3();
                t = E.At(S.Pos).PosInc(t, true);
                break;

            case SUBSUB:                 //  例如  --i
                S.NextToken();
                t = Term3();
                t = E.At(S.Pos).PosDec(t, true);
                break;

            case THIS:
                S.NextToken();

                if (S.Token == EQ)
                {
                    throw ScriptCompileException.CreateSyntaxError(S.Line, S.Col, S.Token, S.TokenString);
                }
                t = E.At(S.Pos).GetThisValue();

                break;

            case FALSE:
                Contract.Assert(S.TokenString == "false");
                t = E.At(S.Pos).Flase();
                S.NextToken();
                break;

            case TRUE:
                Contract.Assert(S.TokenString == "true");
                t = E.At(S.Pos).True();
                S.NextToken();
                break;

            case NUMBER:                     //数字
                t = E.At(S.Pos).Number(S.TokenString);
                S.NextToken();

                break;

            case STRINGLITERAL:               //字符串

                t = E.At(S.Pos).String(S.TokenString);
                S.NextToken();
                break;


            case FUNCTION:              //函数

                S.NextToken();

                t = MethodDeclaratorRest();

                break;

            case LBRACE:

                t = TableInitializer(t);

                break;

            case IDENTIFIER:

                string ident = Ident();

                if (S.Token == EQ)
                {
                    mode = LValue;

                    S.NextToken();

                    if (S.Token != Nil)
                    {
                        t = E.At(S.Pos).Select(t, ident, true);
                    }
                    else
                    {
                        t    = E.At(S.Pos).Remove(t, ident);
                        mode = EXPR;
                    }
                }
                else
                {
                    t = E.At(S.Pos).Select(t, ident, false);

                    if (S.Token == LPAREN)
                    {
                        t = Arguments(t);
                    }
                }
                break;

            default:
                throw ScriptCompileException.CreateSyntaxError(S.Line, S.Col, S.Token, S.TokenString);
            }
            while (true)
            {
                if (S.Token == DOT)
                {
                    S.NextToken();

                    string ident = Ident();

                    if (S.Token == EQ)
                    {
                        mode = LValue;

                        S.NextToken();

                        if (S.Token != Nil)
                        {
                            t = E.At(S.Pos).Select(t, ident, true);
                        }
                        else
                        {
                            t    = E.At(S.Pos).Remove(t, ident);
                            mode = EXPR;
                        }
                    }
                    else if (S.Token == LPAREN)
                    {
                        Expression own = t;
                        t = E.At(S.Pos).Select(t, ident, false);
                        t = Arguments(own, t);
                    }
                    else
                    {
                        t = E.At(S.Pos).Select(t, ident, false);
                    }
                }
                else if (S.Token == LPAREN)    // (
                {
                    t = Arguments(t);
                }
                else if (S.Token == LBRACKET)   // [
                {
                    S.NextToken();

                    Expression t1 = Term();

                    Accept(RBRACKET);

                    if (S.Token == EQ)
                    {
                        mode = LValue;

                        S.NextToken();

                        if (S.Token != Nil)
                        {
                            t = E.At(S.Pos).Select(t, t1, true);
                        }
                        else
                        {
                            t    = E.At(S.Pos).Remove(t, t1);
                            mode = EXPR;
                        }
                    }
                    else if (S.Token == LPAREN)
                    {
                        Expression own = t;
                        t = E.At(S.Pos).Select(t, t1, false);
                        t = Arguments(own, t);
                    }
                    else
                    {
                        t = E.At(S.Pos).Select(t, t1, false);
                    }
                }
                else
                {
                    break;
                }
            }
            while ((S.Token == PLUSPLUS || S.Token == SUBSUB) && (mode & EXPR) != 0)
            {
                mode = EXPR;
                //  t = E.At(S.Pos).Unary(S.Token == PLUSPLUS ? Tree.POSTINC : Tree.POSTDEC, t);
                if (S.Token == PLUSPLUS)    // 后加  例如 i++;
                {
                    t = E.At(S.Pos).PosInc(t, false);
                }
                else
                {
                    t = E.At(S.Pos).PosDec(t, false);
                }
                S.NextToken();
            }
            return(t);
        }
コード例 #7
0
        private Expression Statement()
        {
            switch (S.Token)
            {
            case LBRACE:
                return(Block());

            case IF:
            {
                S.NextToken();
                Expression cond     = ParExpression();
                Expression thenpart = Statement();
                Expression elsepart = null;
                if (S.Token == ELSE)
                {
                    S.NextToken();
                    elsepart = Statement();
                }
                return(E.At(S.Pos).IfThenElse(cond, thenpart, elsepart));
            }

            case FOR:
            {
                S.NextToken();

                Accept(LPAREN);

                Expression inits = S.Token == SEMI?Expression.Empty() : GetExpression();

                Accept(SEMI);

                Expression cond = S.Token == SEMI?Expression.Empty() : GetExpression();

                Accept(SEMI);

                Expression steps = S.Token == RPAREN?Expression.Empty() : GetExpression();

                Accept(RPAREN);

                loopLabelStack.Push(Expression.Label());

                Expression body = Statement();
                return(E.At(S.Pos).ForLoop(inits, cond, steps, body, loopLabelStack.Pop()));
            }

            case WHILE:
            {
                S.NextToken();

                Expression cond = ParExpression();
                loopLabelStack.Push(Expression.Label());
                Expression body = Statement();
                Expression t    = E.At(S.Pos).WhileLoop(cond, body, loopLabelStack.Pop());
                return(t);
            }

            case DO:
            {
                S.NextToken();

                loopLabelStack.Push(Expression.Label());

                Expression body = Statement();

                Accept(WHILE);

                Expression cond = ParExpression();

                Expression t = E.At(S.Pos).DoWhileLoop(body, cond, loopLabelStack.Pop());

                return(t);
            }

            case BREAK:
            {
                S.NextToken();
                //应该先判断是否Peek()为空,以后在处理
                Expression t = E.At(S.Pos).Break(loopLabelStack.Peek());
                Accept(SEMI);
                return(t);
            }

            case RETURN:
            {
                S.NextToken();
                Expression result = S.Token == SEMI ? null : VariableInitializer();
                //应该先判断是否Peek()为空,以后在处理
                Expression t = E.At(S.Pos).Return(funcReturnStack.Peek(), result);
                Accept(SEMI);
                return(t);
            }

            case ELSE:
            {
                throw ScriptCompileException.CreateSyntaxError(S.Line, S.Col, S.Token, S.TokenString);
            }

            default:
            {
                Expression t = GetExpression();
                Accept(SEMI);
                return(t);
            }
            }
        }
コード例 #8
0
        //c
        private BlockExpression BlockStatements()
        {
            List <Expression> stats = new List <Expression>();

            while (true)
            {
                switch (S.Token)   // }
                {
                case RBRACE:       // }

                case EOF:
                    return(Expression.Block(stats));

                case LBRACE:      //  {
                case IF:          //  if

                case FOR:         // for

                case WHILE:       // while

                case DO:          // do

                case RETURN:      //return

                case BREAK:       //break;

                case CONTINUE:

                    stats.Add(Statement());
                    break;

                case LOCAL:
                    S.NextToken();

                    if (S.Token == IDENTIFIER)
                    {
                        stats.Add(VariableDeclaratorsRest(Ident()));
                    }
                    else if (S.Token == FUNCTION)
                    {
                        S.NextToken();
                        stats.Add(E.At(S.Pos).LocalVarDef(Ident(), MethodDeclaratorRest()));
                    }
                    else
                    {
                        throw ScriptCompileException.CreateSyntaxError(S.Line, S.Col, S.Token, S.TokenString);
                    }
                    Accept(SEMI);
                    break;

                case FUNCTION:
                    S.NextToken();

                    functionList.Add(E.At(S.Pos).MethodDef(Ident(), MethodDeclaratorRest()));

                    break;

                default:
                    Expression t = Term(EXPR | TYPE);

                    Contract.Assert(t != null);

                    stats.Add(t);

                    Accept(SEMI);
                    break;
                }
            }
        }