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; }
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; }
private void ReqText(StringReader p, string text) { if (!p.ThisText(text)) throw new Exception("expected '" + text + "'" + "\n" + p.RestOf); }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
private bool ReadBlock(StringReader p, ref CodeBlock block) { if (p.ThisText("{")) { ReadCodes(p, ref block); ReqText(p, "}"); return true; } return false; }
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; }