def ParseKshFunctionDef(self): """ ksh_function_def : 'function' fname ( '(' ')' )? newline_ok function_body """ left_spid = word.LeftMostSpanForWord(self.cur_word) self._Next() # skip past 'function' if not self._Peek(): return None ok, name = word.AsFuncName(self.cur_word) if not ok: self.AddErrorContext("Invalid function name: %r", self.cur_word) return None after_name_spid = word.LeftMostSpanForWord(self.cur_word) + 1 self._Next() # skip past 'function name if not self._Peek(): return None if self.c_id == Id.Op_LParen: self.lexer.PushHint(Id.Op_RParen, Id.Right_FuncDef) self._Next() if not self._Eat(Id.Right_FuncDef): return None # Change it: after ) after_name_spid = word.LeftMostSpanForWord(self.cur_word) + 1 if not self._NewlineOk(): return None func = ast.FuncDef() func.name = name if not self.ParseFunctionBody(func): return None func.spids.append(left_spid) func.spids.append(after_name_spid) return func
def ParseFunctionDef(self): """ function_header : fname '(' ')' function_def : function_header newline_ok function_body ; Precondition: Looking at the function name. Post condition: NOTE: There is an ambiguity with: function foo ( echo hi ) and function foo () ( echo hi ) Bash only accepts the latter, though it doesn't really follow a grammar. """ left_spid = word.LeftMostSpanForWord(self.cur_word) ok, name = word.AsFuncName(self.cur_word) if not ok: self.AddErrorContext("Invalid function name: %r", self.cur_word, word=self.cur_word) return None self._Next() # skip function name # Must be true beacuse of lookahead if not self._Peek(): return None assert self.c_id == Id.Op_LParen, self.cur_word self.lexer.PushHint(Id.Op_RParen, Id.Right_FuncDef) self._Next() if not self._Eat(Id.Right_FuncDef): return None after_name_spid = word.LeftMostSpanForWord(self.cur_word) + 1 if not self._NewlineOk(): return None func = ast.FuncDef() func.name = name if not self.ParseFunctionBody(func): return None func.spids.append(left_spid) func.spids.append(after_name_spid) return func