示例#1
0
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)
示例#2
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, 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]
示例#3
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]