private Parsen MaybeBinary(Parsen left, int myPrec) { var tok = _input.Peek( ); if (IsOp(null)) { var hisPrec = PRECENDENCE[(string)tok["value"]]; if (hisPrec > myPrec) { _input.Next( ); return MaybeBinary( new Parsen( ) { { "type", (string)tok["value"] == "=" || (string)tok["value"] == "->" ? "assign" : "binary"}, { "oper", (string)tok["value"]}, { "left", left }, { "right", MaybeBinary(ParseAtom( ), hisPrec) } }, myPrec ); } } return left; }
private Parsen ParseIf( ) { SkipKw("if"); var cond = ParseExpr( ); if (!IsPunc('{')) throw new Exception( ); var then = ParseExpr( ); var ret = new Parsen( ) { { "type", "if" }, { "cond", cond }, { "then", then } }; if (IsKw("else")) { _input.Next( ); ret["else"] = ParseExpr( ); } return ret; }