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)
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