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