示例#1
0
  def _Param(self, pnode):
    # type: (PNode) -> param
    """
    param: NAME [type_expr] | '...' NAME | '@' NAME
    """
    #log('pnode: %s', pnode)
    assert pnode.typ == grammar_nt.param

    children = pnode.children
    tok0 = children[0].tok
    n = len(children)
    #tok = pnode.tok

    if tok0.id in (Id.Expr_At,):  # ...
      return param(tok0, children[1].tok, None, None)

    if tok0.id == Id.Expr_Name:
      default = None
      if n > 1 and children[1].tok.id == Id.Arith_Equal:  # f(x = 1+2*3)
        default = self.Expr(children[2])
      elif n > 2 and children[2].tok.id == Id.Arith_Equal:  # f(x Int = 1+2*3)
        default = self.Expr(children[3])
      return param(None, tok0, None, default)

    raise AssertionError(tok0)
示例#2
0
    def _Param(self, pnode):
        # type: (PNode) -> param
        """
    param: NAME [type_expr] | '...' NAME | '@' NAME
    """
        #log('pnode: %s', pnode)

        if ISNONTERMINAL(pnode.typ):
            if pnode.typ == grammar_nt.param:  # x Int
                children = pnode.children
                first_tok = children[0].tok
                n = len(children)
                #tok = pnode.tok

                if first_tok.id in (Id.Expr_At, ):  # ...
                    return param(first_tok, children[1].tok, None, None)
                elif first_tok.id == Id.Expr_Name:
                    default = None
                    if n > 1 and children[
                            1].tok.id == Id.Arith_Equal:  # x = 1+2*3
                        default = self.Expr(children[2])
                    elif n > 2 and children[
                            2].tok.id == Id.Arith_Equal:  # x Int = 1+2*3
                        default = self.Expr(children[3])
                    return param(None, first_tok, None, default)
                else:
                    pass
        else:
            if pnode.tok.id == Id.Expr_Name:  # x
                return param(None, pnode.tok, None, None)

        raise AssertionError(pnode)
示例#3
0
  def _ProcParams(self, p_node):
    # type: (PNode) -> proc_sig_t
    """
    proc_params: proc_param (',' proc_param)* [',' '@' Expr_Name]
    """
    children = p_node.children
    n = len(children)

    params = []  # type: List[param]
    rest = None  # type: Optional[Token]
    block = None  # type: Optional[Token]

    i = 0
    while i < n:
      p = children[i]
      if ISNONTERMINAL(p.typ):
        name, default_val = self._ProcParam(p)
        # No type_expr for procs
        type_ = None  # type: type_expr_t
        params.append(param(name, type_, default_val))
      else:
        if p.tok.id == Id.Expr_At:  # @args
          i += 1
          rest = children[i].tok
        elif p.tok.id == Id.Arith_Amp:  # &block
          i += 1
          block = children[i].tok
        else:
          raise AssertionError(Id_str(p.tok.id))
      i += 2

    return proc_sig.Closed(params, rest, block)
示例#4
0
    def _ProcParam(self, pnode):
        # type: (PNode) -> param
        """
    proc_param: [':'] Expr_Name ['=' expr]
    """
        assert pnode.typ == grammar_nt.proc_param

        children = pnode.children
        tok0 = children[0].tok
        n = len(children)

        prefix_tok = None  # type: Token
        i = 0
        if tok0.id == Id.Arith_Colon:
            prefix_tok = tok0
            i += 1

        child = children[i]
        if child.tok.id == Id.Expr_Name:
            name_tok = child.tok
            default_val = None  # type: expr_t
            i += 1
            if i < n and children[
                    i].tok.id == Id.Arith_Equal:  # proc p(x = 1+2*3)
                i += 1
                default_val = self.Expr(children[i])

            # No type_expr for procs
            type_ = None  # type: type_expr_t
            return param(prefix_tok, name_tok, type_, default_val)

        raise AssertionError(Id_str(tok0.id))
示例#5
0
  def _FuncParam(self, pnode):
    # type: (PNode) -> param
    """
    func_param: Expr_Name [type_expr] ['=' expr] | '...' Expr_Name
    """
    assert pnode.typ == grammar_nt.func_param

    children = pnode.children
    tok0 = children[0].tok
    n = len(children)

    if tok0.id == Id.Expr_Name:
      default_val = None  # type: expr_t
      type_ = None  # type: type_expr_t
      if n > 1 and children[1].tok.id == Id.Arith_Equal:  # f(x = 1+2*3)
        default_val = self.Expr(children[2])
      elif n > 2 and children[2].tok.id == Id.Arith_Equal:  # f(x Int = 1+2*3)
        default_val = self.Expr(children[3])
      return param(tok0, type_, default_val)

    raise AssertionError(Id_str(tok0.id))