예제 #1
0
 private bool ReadArrayValue(StringReader p, out ExprPiece value)
 {
     if (p.ThisText("["))
     {
         var list = new List<ExprPiece>();
         ExprPiece item;
         while (ReadValue(p, out item))
         {
             list.Add(item);
             if (!p.ThisText(","))
                 break;
         }
         ReqText(p, "]");
         value = new ArrayExpr
         {
             Items = list.ToArray()
         };
         return true;
     }
     value = null;
     return false;
 }
예제 #2
0
 private bool ReadVar(StringReader p, ref CodeBlock block)
 {
     if (p.ThisWord("var"))
     {
     ANOTHER:
         var jsvar = new VarCode();
         Expect(p, ReadIdent(p, out jsvar.Name), "var name");
         if (p.ThisText("="))
             ReqVal(p, out jsvar.Value);
         AddCode(ref block, jsvar);
         if (p.ThisText(","))
             goto ANOTHER;
         return true;
     }
     return false;
 }
예제 #3
0
 private void ReqText(StringReader p, string text)
 {
     if (!p.ThisText(text))
         throw new Exception("expected '" + text + "'" + "\n" + p.RestOf);
 }
예제 #4
0
 private bool ReadUnaryPreOp(StringReader p, out OperationExpr op)
 {
     op = null;
     int i;
     if (p.ThisText(new[] { "++", "--", "+", "-", "!", "~" }, out i))
     {
         if (i == 0)
             op = new PreIncExpr();
         else if (i == 1)
             op = new PreDecExpr();
         else if (i == 2)
             op = new PlusExpr();
         else if (i == 3)
             op = new NegExpr();
         else if (i == 4)
             op = new BoolNotExpr();
         else if (i == 5)
             op = new BitNotExpr();
     }
     return op != null;
 }
예제 #5
0
 private bool ReadValuePair(StringReader p, ObjectExpr obj)
 {
     var saved = p.Position;
     string pairName;
     if (ReadIdent(p, out pairName) || p.AnyQuoted(out pairName))
     {
         if (p.ThisText(":"))
         {
             ExprPiece pairValue;
             ReqVal(p, out pairValue);
             (obj.Pairs ?? (obj.Pairs = new Dictionary<string, ExprPiece>())).Add(pairName, pairValue);
             return true;
         }
         p.Position = saved;
     }
     return false;
 }
예제 #6
0
 private bool ReadParensValue(StringReader p, out ExprPiece value)
 {
     if (p.ThisText("("))
     {
         var parens = new ParensExpr();
         ReadValue(p, out parens.InnerExpr);
         ReqText(p, ")");
         value = parens;
         return true;
     }
     value = null;
     return false;
 }
예제 #7
0
 private bool ReadUnaryPosOp(StringReader p, out OperationExpr op)
 {
     op = null;
     int i;
     if (p.ThisText(new[] { "++", "--" }, out i))
         switch (i)
         {
             case 0:
                 op = new PosIncExpr();
                 break;
             case 1:
                 op = new PosDecExpr();
                 break;
         }
     return op != null;
 }
예제 #8
0
 private bool ReadObjectValue(StringReader p, out ExprPiece value)
 {
     if (p.ThisText("{"))
     {
         var obj = new ObjectExpr();
         while (ReadValuePair(p, obj))
             if (!p.ThisText(","))
                 break;
         ReqText(p, "}");
         value = obj;
         return true;
     }
     value = null;
     return false;
 }
예제 #9
0
 private bool ReadParamsExpr(StringReader p, out ParamsExpr value)
 {
     if (p.ThisText("("))
     {
         var list = new List<ExprPiece>();
         ExprPiece paramRead;
         while (ReadValue(p, out paramRead))
         {
             list.Add(paramRead);
             if (!p.ThisText(","))
                 break;
         }
         ReqText(p, ")");
         value = new ParamsExpr
         {
             Params = list.ToArray()
         };
         return true;
     }
     value = null;
     return false;
 }
예제 #10
0
 private bool ReadFunctionBody(StringReader p, bool reqName, out FunctionCode func)
 {
     var saved = p.Position;
     if (p.ThisWord("function"))
     {
         var jsfn = new FunctionCode();
         // esse Reader pode ser chamado para declaracao de funcoes ou para expressoes de funcoes anonimas
         // reqName diferencia esses dois usos, um tem nome o outro nao
         // ex.: function X(){} ou function(){}
         if (reqName)
             Expect(p, ReadIdent(p, out jsfn.Name), "func name");
         ReqText(p, "(");
         var plist = new List<string>();
         string pn;
         while (ReadIdent(p, out pn))
         {
             plist.Add(pn);
             if (!p.ThisText(","))
                 break;
         }
         jsfn.Params = plist.Count > 0 ? plist.ToArray() : null;
         ReqText(p, ")");
         ReqText(p, "{");
         ReadCodes(p, ref jsfn.Code);
         ReqText(p, "}");
         func = jsfn;
         return true;
     }
     func = null;
     return false;
 }
예제 #11
0
 private bool ReadIndexMember(StringReader p, ref ExprPiece value)
 {
     if (p.ThisText("["))
     {
         var index = new IndexExpr();
         index.Array = value;
         ReqVal(p, out index.Index);
         ReqText(p, "]");
         value = index;
         return true;
     }
     return false;
 }
예제 #12
0
 private bool ReadDotMember(StringReader p, ref ExprPiece value)
 {
     var saved = p.Position;
     if (p.ThisText("."))
     {
         string nameRead;
         if (ReadIdent(p, out nameRead))
         {
             value = new DotExpr
             {
                 MemberName = nameRead,
                 LeftArg = value
             };
             return true;
         }
         p.Position = saved;
     }
     return false;
 }
예제 #13
0
 private bool ReadCode(StringReader p, ref CodeBlock block)
 {
     var lret = ReadBlock(p, ref block) || ReadIf(p, ref block) || ReadWhile(p, ref block) ||
         ReadDo(p, ref block) || ReadFunctionDecl(p, ref block) || ReadDelete(p, ref block) || ReadTry(p, ref block) ||
         ReadVar(p, ref block) || ReadForEach(p, ref block) || ReadFor(p, ref block) || ReadSwitch(p, ref block) ||
         ReadBreak(p, ref block) || ReadReturn(p, ref block) || ReadContinue(p, ref block) || ReadCall(p, ref block);
     if (lret)
         p.ThisText(";");
     return lret;
 }
예제 #14
0
 private bool ReadClosure(StringReader p, out FunctionCode func)
 {
     var saved = p.Position;
     var plist = new List<string>();
     string pn;
     if (p.ThisText("("))
     {
         while (ReadIdent(p, out pn))
         {
             plist.Add(pn);
             if (!p.ThisText(","))
                 break;
         }
         if (!p.ThisText(")"))
             goto Mistaken;
     }
     else if (ReadIdent(p, out pn))
         plist.Add(pn);
     if (p.ThisText(":"))
     {
         var jsfn = new FunctionCode();
         jsfn.Params = plist.Count > 0 ? plist.ToArray() : null;
         if (p.ThisText("{"))
         {
             ReadCodes(p, ref jsfn.Code);
             ReqText(p, "}");
         }
         else
         {
             ExprPiece arg;
             ReqVal(p, out arg);
             AddCode(ref jsfn.Code, new ReturnCode { Arg = arg });
         }
         func = jsfn;
         return true;
     }
     Mistaken:
     p.Position = saved;
     func = null;
     return false;
 }
예제 #15
0
 private bool ReadBlock(StringReader p, ref CodeBlock block)
 {
     if (p.ThisText("{"))
     {
         ReadCodes(p, ref block);
         ReqText(p, "}");
         return true;
     }
     return false;
 }
예제 #16
0
 private bool ReadBinaryOp(StringReader p, out OperationExpr bin)
 {
     bin = null;
     int i;
     if (p.ThisText(BinaryOpStrings, out i))
     {
         bin = (OperationExpr)Activator.CreateInstance(BinaryOpTypes[i]);
         return true;
     }
     return false;
 }