def parse(cls, node, annos, mods): _node = node.getChildren()[-1] typ = util.implode_id(_node.getChild(0)) name = _node.getChild(1) fid = name.getChild(0).getText() if name.getChildCount() > 1: init = exp.parse_e(name.getChild(1).getChild(0), cls) else: init = None fld = Field(clazz=cls, annos=annos, mods=mods, typ=typ, name=fid, init=init) cls.flds.append(fld)
def parse_s(mtd, node): curried_s = partial(parse_s, mtd) curried_e = lambda n: parse_e(n, mtd.clazz) _node = node.getChild(0) kind = _node.getText() _nodes = node.getChildren() # (S... (E... ) ';') if kind == C.T.EXP: _nodes = _node.getChildren() # (S... (E... var = (E... )) ';') if len(_nodes) >= 3 and _nodes[-2].getText() == '=': # var can be a list of nodes, e.g., x . y var_node = util.mk_v_node_w_children(_nodes[:-2]) le = curried_e(var_node) re = curried_e(_nodes[-1]) s = gen_S_assign(le, re) else: s = gen_S_e(curried_e(_node)) # (S... assume (E... ) ';') elif kind == "assume": e = curried_e(node.getChild(1)) s = gen_S_assume(e) # (S... assert (E... ) ';') elif kind == "assert": e = curried_e(node.getChild(1)) s = gen_S_assert(e) # (S... return (E... )? ';') elif kind == "return": if node.getChildCount() > 2: s = gen_S_rtn(curried_e(node.getChild(1))) else: s = gen_S_rtn() # (S... if (E... ) { (S... ) } (else { (S... ) })?) elif kind == "if": e = curried_e(node.getChild(1)) ss = _nodes[2:] # exclude first two nodes: S... if i = next((i for i, n in enumerate(ss) if n.getText() == "else"), -1) if i == -1: # no else branch t_s = rm_braces(ss) f_s = [] else: t_s = rm_braces(ss[:i]) f_s = rm_braces(ss[i + 1:]) ts = map(curried_s, t_s) fs = map(curried_s, f_s) s = gen_S_if(e, ts, fs) # (S... switch (E cond) { (case (E case1) { (S1...) } ) ... (default { Sd } ) } # => # desugaring at this parsing phase # if (cond == case1) { S1 } else if ... else { Sd } elif kind == "switch": def parse_cases(case_node): _case_nodes = case_node.getChildren() label = case_node.getText() if label == "case": e_case = curried_e(_case_nodes[0]) ss_case = map(curried_s, rm_braces(_case_nodes[1:])) elif label == "default": e_case = None ss_case = map(curried_s, rm_braces(_case_nodes)) else: raise Exception("irregular grammar", node.toStringTree()) return (label, e_case, ss_case) e_cond = curried_e(node.getChild(1)) ss = _nodes[2:] # exclude first two nodes: S... switch cases = map(parse_cases, rm_braces(ss)) _cases, _default = util.partition(lambda (l, c, ss): l == "case", cases) def rm_break(ss): return filter(lambda s: s.kind != C.S.BREAK, ss) def desugar(acc, (label, e_case, ss)): if label != "case": return acc # double-check e = gen_E_bop(u"==", e_cond, e_case) return [gen_S_if(e, rm_break(ss), acc)] default_ss = rm_break(_default[0][2]) if _default else [] s = reduce(desugar, _cases, default_ss)[0]
def parse_s(mtd, node): curried_s = partial(parse_s, mtd) curried_e = lambda n: parse_e(n, mtd.clazz) _node = node.getChild(0) kind = _node.getText() _nodes = node.getChildren() # (S... (E... ) ';') if kind == C.T.EXP: _nodes = _node.getChildren() # (S... (E... var = (E... )) ';') if len(_nodes) >= 3 and _nodes[-2].getText() == '=': # var can be a list of nodes, e.g., x . y var_node = util.mk_v_node_w_children(_nodes[:-2]) le = curried_e(var_node) re = curried_e(_nodes[-1]) s = gen_S_assign(le, re) else: s = gen_S_e(curried_e(_node)) # (S... assume (E... ) ';') elif kind == "assume": e = curried_e(node.getChild(1)) s = gen_S_assume(e) # (S... assert (E... ) ';') elif kind == "assert": e = curried_e(node.getChild(1)) s = gen_S_assert(e) # (S... return (E... )? ';') elif kind == "return": if node.getChildCount() > 2: s = gen_S_rtn(curried_e(node.getChild(1))) else: s = gen_S_rtn() # (S... if (E... ) { (S... ) } (else { (S... ) })?) elif kind == "if": e = curried_e(node.getChild(1)) ss = _nodes[2:] # exclude first two nodes: S... if i = next((i for i, n in enumerate(ss) if n.getText() == "else"), -1) if i == -1: # no else branch t_s = rm_braces(ss) f_s = [] else: t_s = rm_braces(ss[:i]) f_s = rm_braces(ss[i+1:]) ts = map(curried_s, t_s) fs = map(curried_s, f_s) s = gen_S_if(e, ts, fs) # (S... switch (E cond) { (case (E case1) (S1...)) ... (default Sd) } # => # desugaring at this parsing phase # if (cond == case1) { S1 } else if ... else { Sd } elif kind == "switch": def parse_cases(case_node): _case_nodes = case_node.getChildren() label = case_node.getText() if label == "case": e_case = curried_e(_case_nodes[0]) ss_case = map(curried_s, _case_nodes[1:]) elif label == "default": e_case = None ss_case = map(curried_s, _case_nodes) else: raise Exception("illegular grammar", node.toStringTree()) return (label, e_case, ss_case) e_cond = curried_e(node.getChild(1)) ss = _nodes[2:] # exclude first two nodes: S... switch cases = map(parse_cases, rm_braces(ss)) _cases, _default = util.partition(lambda (l,c,ss): l == "case", cases) def rm_break(ss): return filter(lambda s: s.kind != C.S.BREAK, ss) def desugar(acc, (label, e_case, ss)): if label != "case": return acc # double-check e = gen_E_bop(u"==", e_cond, e_case) return [gen_S_if(e, rm_break(ss), acc)] default_ss = rm_break(_default[0][2]) if _default else [] s = reduce(desugar, _cases, default_ss)[0]