def run(self, params, lineno, colno): if len(params) != len(self.params) and self.params[-1] != '...': raise Exception('Error: too %s parameters to function %s: %s' % ('many' if len(params) > len(self.params) else 'few', self.name, ', '.join([str(x) for x in params]))) paramValues = dict() for (index, param) in enumerate(self.params): if param == '...': if index != (len(self.params) - 1): raise Exception('Error: ellipsis must be the last parameter in parameter list') paramValues['__VA_ARGS__'] = [] for va_arg_rlist, next in zip_longest(params[index:], params[index+1:]): paramValues['__VA_ARGS__'].extend(va_arg_rlist) if next: paramValues['__VA_ARGS__'].append(cToken(self.cP.terminals['comma'], '<stream>', 'comma', ',', 0, 0, None)) else: paramValues[param] = params[index] nodes = [] if not self.body: return nodes for node in self.body.getAttr('tokens'): if node.terminal_str.lower() == 'identifier' and node.getString() in paramValues: val = paramValues[node.getString()] if isinstance(val, list): nodes.extend(deepcopy(val)) else: nodes.append(copy(val)) else: newNode = copy(node) nodes.append(newNode) nodes = self.cPE._eval(ppAst('ReplacementList', {'tokens': nodes})) for node in nodes: node.lineno = lineno node.colno = colno return nodes
def preprocess_replace(ctokens): return self._eval(ppAst('ReplacementList', {'tokens': ctokens}))