예제 #1
0
파일: expr_to_ast.py 프로젝트: grahamc/oil
  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)
예제 #2
0
파일: expr_to_ast.py 프로젝트: grahamc/oil
  def Proc(self, pnode):
    # type: (PNode) -> proc_sig_t
    """
    oil_proc: ['(' [proc_params] ')'] '{'
    """
    typ = pnode.typ
    children = pnode.children
    assert typ == grammar_nt.oil_proc

    n = len(children)
    if n == 1:  # proc f { 
      sig = proc_sig.Open()  # type: proc_sig_t
    elif n == 3:  # proc f () {
      sig = proc_sig.Closed()  # no params
    elif n == 4:  # proc f [foo, bar='z', @args] {
      sig = self._ProcParams(children[1])
    else:
      raise AssertionError(n)

    return sig