func (p *Parser) parseInterface() *ast.Interface { i := &ast.Interface{ Inherits: make([]string, 0), } p.expect(token.Identifier) i.Name = p.current.Val p.namespace.ClassesAndInterfaces[i.Name] = i if p.peek().Typ == token.Extends { p.expect(token.Extends) for { p.expect(token.Identifier) i.Inherits = append(i.Inherits, p.current.Val) if p.peek().Typ != token.Comma { break } p.expect(token.Comma) } } p.expect(token.BlockBegin) for p.peek().Typ != token.BlockEnd { vis, _ := p.parseVisibility() if p.peek().Typ == token.Static { p.next() } p.next() switch p.current.Typ { case token.Function: f := p.parseFunctionDefinition() m := ast.Method{ Visibility: vis, FunctionStmt: &ast.FunctionStmt{FunctionDefinition: f}, } i.Methods = append(i.Methods, m) p.expect(token.StatementEnd) case token.Const: constant := ast.Constant{} p.expect(token.Identifier) constant.Name = p.current.Val if p.peek().Typ == token.AssignmentOperator { p.expect(token.AssignmentOperator) constant.Value = p.parseNextExpression() } i.Constants = append(i.Constants, constant) p.expect(token.StatementEnd) default: p.errorf("unexpected interface member %v", p.current) } } p.expect(token.BlockEnd) return i }