Exemple #1
0
        public StructAssign ParseAssign(ref int i)
        {
            if (toks.Tokes[i].Token != Token.Id)
            {
                Error(i, "Expecting identifier");
            }
            Log("Parsing Assign", i);

            var assign = new StructAssign();

            while (true)
            {
                var var_name = toks.Tokes[i].Text;
                if (var_name == ".")
                {
                    i++;
                    continue;
                }
                if (var_name == "=")
                {
                    i--;
                    break;
                }
                else
                {
                    i++;
                    var nv = new Var();
                    nv.Name = var_name;
                    assign.Vars.Add(nv);
                }
            }

            if (assign.Vars[0].Name == "ti")
            {
                int bb = 1;
            }

            AssertTok(i + 1, Token.Equal, "Expecting =");

            i = i + 2;

            bool call = false;


            //            assign.Vars.Add(av);


            if (!call)
            {
                StructExpr exp = ParseExp(ref i);

                assign.Expr.Add(exp);
            }

            Log("End of assign:", i);

            return(assign);
        }
Exemple #2
0
 public void TestExpr(StructExpr expr)
 {
     if (expr.Expr.Count > 0)
     {
         foreach (var se in expr.Expr)
         {
             TestExpr(se);
         }
     }
     else
     {
         switch (expr.Type)
         {
         case ExprType.VarValue:
         case ExprType.ClassValue:
             isObj = true;
             break;
         }
     }
 }
Exemple #3
0
        public StructExpr ParseExp(ref int i)
        {
            Log("Parsing expressionj", i);

            var exp = new StructExpr();

            bool prev_op     = false;
            bool first_toke  = true;
            bool prev_op_min = false;

            for (i = i; i < toks.Len; i++)
            {
                switch (Get(i).Token)
                {
                case Token.New:
                    Console.WriteLine("New");
                    var newe = new StructExpr();
                    newe.NewClass     = true;
                    newe.Type         = ExprType.NewClass;
                    newe.NewClassType = Get(i + 1).Text;
                    Log("New Class:" + newe.NewClassType);
                    i = NextToken(i, Token.LeftPara);
                    exp.Expr.Add(newe);
                    //i--;
                    if (Get(i + 1).Text != ")")
                    {
                        newe.NewPars = ParseCallPars(ref i);
                    }
                    else
                    {
                        i++;
                    }

                    return(exp);

                    break;
                    break;

                case Token.RightPara:
                case Token.EndLine:
                case Token.Comma:

                    Log("Expr:" + exp.DebugString(), i);

                    return(exp);

                    break;

                case Token.Id:
                    Log("VarInExpr:" + Get(i).Text, i);
                    var ie = new StructExpr();
                    ie.Type = ExprType.ClassVar;

                    while (true)
                    {
                        var ve = new StructExpr();
                        ve.Type    = ExprType.VarValue;
                        ve.VarName = Get(i).Text;
                        ie.Expr.Add(ve);
                        if (Get(i + 1).Text == ".")
                        {
                            i += 2;
                            continue;
                        }
                        else
                        {
                            if (Get(i + 1).Text == "(")
                            {
                                if (Get(i + 2).Text == ")")
                                {
                                    i = i + 2;
                                }
                                else
                                {
                                    i++;
                                    ve.CallPars = ParseCallPars(ref i);
                                }
                            }
                            break;
                        }
                    }
                    exp.Expr.Add(ie);
                    if (!prev_op && !first_toke)
                    {
                        Error(i, "Expecting operator.");
                    }
                    prev_op    = false;
                    first_toke = false;

                    break;

                case Token.LeftPara:

                    i++;
                    var sub_e = ParseExp(ref i);
                    first_toke = false;
                    sub_e.Type = ExprType.SubExpr;
                    exp.Expr.Add(sub_e);

                    break;

                case Token.Greater:

                    if (prev_op || first_toke)
                    {
                        Error(i, "Expecting value.");
                    }

                    var more_op = new StructExpr();
                    more_op.Op   = OpType.MoreThan;
                    more_op.Type = ExprType.Operator;
                    exp.Expr.Add(more_op);
                    prev_op = true;

                    break;

                case Token.Lesser:

                    if (prev_op || first_toke)
                    {
                        Error(i, "Expecting value.");
                    }

                    var less_op = new StructExpr();
                    less_op.Op   = OpType.LessThan;
                    less_op.Type = ExprType.Operator;
                    exp.Expr.Add(less_op);
                    prev_op = true;

                    break;

                case Token.Equal:

                    if (prev_op || first_toke)
                    {
                        Error(i, "Expecting value.");
                    }

                    var equal_op = new StructExpr();
                    equal_op.Op   = OpType.EqualTo;
                    equal_op.Type = ExprType.Operator;
                    exp.Expr.Add(equal_op);
                    prev_op = true;

                    break;

                case Token.Plus:

                    if (prev_op || first_toke)
                    {
                        Error(i, "Expecting value.");
                    }



                    var ep = new StructExpr();
                    ep.Op   = OpType.Plus;
                    ep.Type = ExprType.Operator;
                    exp.Expr.Add(ep);
                    prev_op = true;
                    break;


                case Token.Minus:

                    if (prev_op_min)
                    {
                        Error(i, "too many negations operators.");
                    }

                    if (prev_op)
                    {
                        if (first_toke)
                        {
                            Error(i, "Illegal minus op.");
                        }

                        var nv = new StructExpr();
                        nv.Type = ExprType.Operator;
                        nv.Op   = OpType.Minus;
                        exp.Expr.Add(nv);
                        prev_op     = true;
                        prev_op_min = true;
                        continue;

                        //Error(i, "Expecting value.");
                    }


                    var em = new StructExpr();
                    em.Type = ExprType.Operator;
                    em.Op   = OpType.Minus;
                    exp.Expr.Add(em);
                    prev_op = true;

                    break;

                case Token.Div:

                    if (prev_op || first_toke)
                    {
                        Error(i, "Expecting value.");
                    }

                    Log("Times?", i);
                    var ed = new StructExpr();
                    ed.Type = ExprType.Operator;
                    ed.Op   = OpType.Divide;
                    exp.Expr.Add(ed);

                    prev_op = true;


                    break;

                case Token.Multi:

                    if (prev_op || first_toke)
                    {
                        Error(i, "Expecting value.");
                    }


                    var eo = new StructExpr();

                    eo.Type = ExprType.Operator;
                    eo.Op   = OpType.Times;

                    exp.Expr.Add(eo);


                    prev_op = true;

                    break;

                case Token.String:

                    if (!prev_op && !first_toke)
                    {
                        Error(i, "Expecting operator.");
                    }
                    prev_op = false;
                    var es = new StructExpr();
                    es.StringV = Get(i).Text;
                    es.Type    = ExprType.StringValue;
                    exp.Expr.Add(es);
                    first_toke = false;

                    break;

                case Token.Float:
                    if (!prev_op && !first_toke)
                    {
                        Error(i, "Expecting operator.");
                    }
                    prev_op = false;
                    var evf = new StructExpr();
                    evf.floatV = float.Parse(Get(i).Text);
                    evf.Type   = ExprType.FloatValue;
                    exp.Expr.Add(evf);
                    first_toke = false;

                    break;

                case Token.Int:

                case Token.Short:
                case Token.Long:
                case Token.Double:


                    if (!prev_op && !first_toke)
                    {
                        Error(i, "Expecting operator.");
                    }
                    prev_op = false;
                    var ev = new StructExpr();
                    ev.intV = int.Parse(Get(i).Text);
                    ev.Type = ExprType.IntValue;
                    exp.Expr.Add(ev);
                    first_toke = false;

                    break;

                default:
                    Error(i, "Illegal token within expression:" + Get(i).ToString());
                    break;
                }
            }

            Log("Expr:" + exp.DebugString(), i);

            return(exp);
        }
Exemple #4
0
        public void WriteExpr(StructExpr expr)
        {
            if (expr.Expr.Count > 0)
            {
                int ei = 0;
                foreach (var se in expr.Expr)
                {
                    WriteExpr(se);
                    ei++;
                    if (ei < expr.Expr.Count)
                    {
                        isObj = false;
                        TestExpr(expr.Expr[ei]);
                        //if(expr.Expr[ei].Type
                    }
                    if (ei < expr.Expr.Count)
                    {
                        if (!osfuncs.Contains(pobj) && pobj != "N" && isObj == true)
                        {
                            C(".");
                        }
                        pobj = "";
                        //   C(",");
                    }
                }
            }
            else
            {
                switch (expr.Type)
                {
                case ExprType.StringValue:

                    C(" \"" + expr.StringV + "\"");
                    pobj = "N";

                    break;

                case ExprType.IntValue:
                    C(" " + expr.intV + " ");
                    pobj = "N";
                    break;

                case ExprType.FloatValue:
                    C(" " + expr.floatV + "f");
                    pobj = "N";
                    break;

                case ExprType.SubExpr:
                    int oh = 1;

                    break;

                case ExprType.ClassVar:
                    int oh2 = 2;
                    break;

                case ExprType.VarValue:

                    C(" " + expr.VarName);
                    if (expr.CallPars != null)
                    {
                        C("(");
                        WriteCallPars(expr.CallPars);
                        C(")");
                    }
                    else
                    {
                        if (osfuncs.Contains(expr.VarName))
                        {
                            C("(");
                            C(")");
                        }
                    }
                    pobj = expr.VarName;
                    break;

                case ExprType.NewClass:
                    C(" new ");

                    if (expr.NewPars != null)
                    {
                        C(expr.NewClassType);
                        C("(");
                        WriteCallPars(expr.NewPars);
                        C(")");
                        break;
                    }
                    if (expr.CallPars != null)
                    {
                        C(expr.NewClassType);
                        C("(");
                        WriteCallPars(expr.CallPars);
                        C(")");
                    }
                    else
                    {
                        C(expr.NewClassType);
                        C("()");
                    }
                    break;

                case ExprType.Operator:
                    switch (expr.Op)
                    {
                    case OpType.Null:
                        C(" null ");
                        break;

                    case OpType.LessThan:
                        C(" < ");
                        break;

                    case OpType.MoreThan:
                        C(" > ");
                        break;

                    case OpType.Plus:
                        C(" + ");
                        break;

                    case OpType.Minus:
                        C(" - ");
                        break;

                    case OpType.Divide:
                        C(" / ");
                        break;

                    case OpType.Times:
                        C(" * ");
                        break;

                    case OpType.EqualTo:
                        C(" == ");
                        break;
                    }
                    pobj = "N";
                    break;
                }
            }
        }