def checkOr(s_exp): if isinstance(s_exp,sexprs.Pair): if isinstance(s_exp.second,sexprs.Nil): return AbstractSchemeExpr.parse_after_reader(s_exp.first) else: return AbstractSchemeExpr.parse_after_reader(sexprs.false()) return Or(s_exp)
def andToIf(s_exp): if isinstance(s_exp,sexprs.Nil): return sexprs.true() if isinstance(s_exp,sexprs.Pair): if isinstance(s_exp.second,sexprs.Nil): return s_exp.first return sexprs.Pair(sexprs.Symbol("IF"),sexprs.Pair(s_exp.first,sexprs.Pair( sexprs.Pair(sexprs.Symbol("AND"),s_exp.second) ,sexprs.Pair(sexprs.false(),sexprs.Nil()))))
.catens(3) \ .done() p_skip = ps.parser(pc.pcWhite1) \ .parser(p_line_comment) \ .parser(pSexpr_comment) \ .disjs(3) \ .star() \ .done() true_p = ps.parser(pc.pcWordCI('#t')) \ .pack(lambda m: sexprs.true()) \ .done() false_p = ps.parser(pc.pcWordCI('#f')) \ .pack(lambda m: sexprs.false()) \ .done() boolean_p = ps.parser(true_p) \ .parser(false_p) \ .disj() \ .done() nat_p = ps.parser(pc.const(lambda x: x=='+')) \ .parser(pc.plus(pc.pcOneOf('0123456789'))) \ .caten() \ .pack(lambda m: sexprs.Integer(int(m[0]+"".join(m[1])))) \ .parser(pc.plus(pc.pcOneOf('0123456789'))) \ .pack(lambda m: sexprs.Integer(int("".join(m)))) \ .disj() \ .done()